记一次 PHP 渗透测试实战教程
0x01 前言
在渗透测试过程中,开发不可能每一次都将结果输出到页面上,也就是漏洞无回显的情况,那么在这种情况下,我们可以通过 dnslog 判断漏洞存在,或者通过起一个 python 的 http 服务来判断,方法很多,下面主要进行一些情况的分析。
0x02 无回显概念
无回显,即执行的 payload 在站点没有输出,无法进行进一步操作。在渗透测试过程中,漏洞点不可能总是能够在返回页面进行输出,那么这时候就需要进行一些无回显利用了。
0x03 不同漏洞的无回显
1、SQL 注入无回显
SQL 注入,作为 OWASP 常年占据榜首位置的漏洞,在无回显中也是常见的。当然 SQL 注入在无回显上已经具有了一定的解决措施。无回显我将其定义为页面没有输出我们想要得到的内容,下面以 sqli-labs 为例进行讲解。
1.1 布尔盲注
布尔盲注,盲注的一种,当网站通过查询语句的布尔值返回真假来输出页面信息的时候,查询语句为真,页面输出内容;查询语句为假,页面不输出内容。那么这里就可以通过构造等号判断,获取相应的字符的 ascii 码,最后还原出数据。具体测试过程如下:1、id 传参 1 之后,页面返回有数据,这里明显不能进行显错注入了。
2、在传参后面加个单引号,页面返回空,不显示错误信息,不能使用报错注入。
3、通过拼接 and 1=1 和 and 1=2,发现页面对于布尔值的真与假返回的页面结果也不同。
4、通过 length()函数判断数据库库名的长度大于 1。?id=1' and length(database())>1 %23
5、在大于 8 的时候页面返回空,所以数据库库名长度等于 8。
6、通过 ascii()函数和 substr ()截取函数获取数据库库名的第一个字符的 ascii 码?id=1' and ascii(substr((select database()),1,1))>97 %23?id=1' and ascii(substr((select database()),1,1))=101 %23 首先用大于号判断出大概所处的值,最后使用等于号验证 ascii 码的值。此处得出数据库库名的第一个字符的 ascii 码值为 115,对应字符为 s。
7、更改截取的位置,判断后面的字符对应的 ascii 码值。?id=1' and ascii(substr((select database()),2,1))=101 %23
1.2 延时盲注
延时盲注,一种盲注的手法。在渗透测试过程中当我们不能使用显错注入、报错注入以及布尔盲注无论布尔值为真还是为假,页面都返回一样之后,我们可以尝试使用延时盲注,通过加载页面的时间长度来判断数据是否成功。在 PHP 中有一个 if()函数,语法为 if(exp1,exp2,exp3),当 exp1 返回为真时,执行 exp2,返回为假时,执行 exp3。配合延时函数 sleep()来获取相应数据的 ascii 码,最后还原成数据。下面我将通过实例来介绍如今进行延时盲注。1、首先获取的页面如下,后面不论接上布尔值为真还是为假的,页面都返回一样,此时将不能使用布尔盲注。
2、通过 and 拼接延时函数查看页面是否有延时回显。首先记录没有使用延时函数的页面返回时间,为 4.*秒;使用 sleep(5)延时 5 秒之后,页面响应时间为 9.*秒,说明对于我们输入的 sleep()函数进行了延时处理,此处存在延时盲注。
3、通过延时注入判断数据库库名的长度。一个个测试发现当长度等于 8 时页面延时返回了,说明数据库库名长度为 8。?id=2' and if((length(database())=8),sleep(5),1) %23
4、与布尔盲注一样,将子查询的数据截断之后判断 ascii 码,相等时延时 5 秒。最后得到第一个字符的 ascii 码为 115。?id=2' and if((ascii(substr((select database()),1,1))=115),sleep(5),1) %23
5、后面替换截断的位置,测试后面的字符的 ascii 码值。最后得到对应的 ascii 码值为 115 101 99 117 114 105 116 121。通过 ascii 解码工具解得数据库库名为 security。
巧用 dnslog 进行 SQL 注入
前面介绍了 SQL 注入中的盲注,通过布尔盲注或者延时盲注来获取数据需要的步骤非常繁琐,不仅需要一个一个字符的获取,最后还需要进行 ascii 解码,这需要花费大量的时间与精力。为了加快渗透进程,以及降低获取数据的难度,这里介绍如何通过 dnslog 进行 SQL 注入。
Dnslog
dnslog,即 dns 日志,会解析访问 dns 服务的记录并显示出来,常被用来测试漏洞是否存在以及无法获取数据的时候进行外带数据。简单来说,dnslog 就是一个服务器,会记录所有访问它的记录,包括访问的域名、访问的 IP 以及时间。那么我们就可以通过子查询,拼接 dnslog 的域名,最后通过 dns 日志得到需要的数据。
Load_file()函数
数据库中的 load_file()函数,可以加载服务器中的内容。load_file('c:/1.txt'),读取文件并返回内容为字符串,使用 load_file()函数获取数据需要有以下几个条件:1.文件在服务器上 2.指定完整路径的文件 3.必须有 FILE 权限
UNC 路径
UNC 路径就是类似\softer 这样的形式的网络路径。它符合 \服务器名\服务器资源的格式。在 Windows 系统中常用于共享文件。如\192.168.1.1\共享文件夹名。
Dnslog 注入实例演示
1、打开实例站点,很明显这里是只能使用盲注的站点。
2、通过 order by 判断出字段数为 3。
3、在 dnslog 网站申请一个 dnslog 域名:pcijrt.dnslog.cn
4、通过 load_file 函数拼接查询数据库库名的子查询到 dnslog 的域名上,后面任意接一个不存在的文件夹名。最后将这个查询放到联合查询中,构造的 payload 如下:
5、执行语句之后在 dnslog 日志中获取到数据库库名为 security。
6、修改子查询里的内容,获取其他数据。
2、XSS 无回显
XSS 无回显比较特殊,一般 XSS 漏洞的判断标准为弹框,但是有这样一种情况,在一个表单提交处,内容提交之后只会在页面显示提交成功与否,不会输出提交的内容,那么我们也就无法通过弹框来判断 XSS 漏洞存在与否。这时候就需要通过 XSS 盲打来进行攻击。下面通过 Pikachu 漏洞练习平台来进行实例讲解:
2.1 XSS 盲打
1、如图这里是一个提交看法的功能
2、随便输入内容提交,告诉我们提交成功,没有将我输入的内容返回到页面中
3、登录后台可以看到确实有数据回显
4、输入弹框语句会在后台成功执行
5、在渗透测试过程中我们无法登录后台进行查看,那么就需要盲打 XSS,输入 XSS 平台的 payload,坐等管理员查看内容后上钩。
2.2 通过 dnslog 判断漏洞存在
3、SSRF 无回显
SSRF 即服务端请求伪造,一种由攻击者构造的通过服务器发起请求的攻击。测试代码如下:
首先通过访问百度可以验证漏洞存在
无回显情况即不进行输出,页面返回空
这种情况可以通过 dnslog 或者 python 搭建 http 服务验证 1、DNSLOGhttp://172.16.29.2/ssrf_test.php?url=http://ssrf.02c6ot.dnslog.cn
2、python 起的 http 服务
4、XXE 无回显
因为 XML 是用来存储传输数据的,除了确实是业务需要,否则开发不可能会输出内容,也就是说你确实读取到了文件内容,但是没办法看到。XXE 无回显问题当然也是可以通过在域名前面放入查询出的内容,将数据通过 dns 日志记录下来。XXE 虽然不是通过 DNSlog,但是也同样是外带数据。流程如下:在受害者网站中,我们通过请求攻击者 VPS 上的 1.xml 文件,文件内容为将某数据放在 GET 传参中去访问 2.php。然后 2.php 中的内容为保存 GET 传参的数据,将数据放入到 3.txt 中。具体文件内容放在下面,里面的 IP 地址应该为攻击者的 IP 地址,这 3 个文件也是放在攻击者 VPS 上。1.xml
2.php
3.txt
5、命令执行无回显
简单的命令执行站点
输入任何命令都无回显
5.1 Dnslog 判断漏洞存在
5.2Dnslog 外带数据
5.2.1 获取 windows 用户名
5.2.2 其他命令执行
通过 POST 传参测试
传参的内容需要进行 url 编码
Post 传参
Dnslog 获取结果
Base64 解码获取内容
总结
在渗透测试过程中,无回显是很常见的,程序不可能将一些操作都回显到页面中,那么这种时候我们就需要外带数据来获取想要的内容。当然最好就是能够反弹 shell,通过获取 shell 来执行命令,这样会舒服很多。
无回显的情况还有很多很多,这里简单介绍了几种,希望读者朋友们能够从中学到对于无回显的情况下如何进行渗透测试,方法很多,不固定,学习思路即可。
评论