由于篇幅原因,源码详见GITHUB源码链接。同时在这感谢红日安全的分享。因为笔者还是个菜鸡,所以有些地方难免有些错误,请各大佬斧正。同时本篇总结以代码审计为主,部分可能会弱化具体的攻击方法
DAY 1
程序本质 | 文件上传 |
---|---|
漏洞本质 | 函数缺陷导致的任意文件上传漏洞 |
缺陷函数 | in_array函数 |
攻击类型 | 绕过检验 |
众所周知,php是弱类型语言,当未将in_array函数第三个参数设置为true时,默认进行宽松比较。所以函数在执行搜索项时,会将搜索值强制转换成数字类型。漏洞即在此产生。
攻击:
当我们创建一个文件名首数字为1-24之间的文件。即可通过in_array函数判断,导致任意文件上传漏洞。例:7shell.php
DAY 2
程序本质 | 用twig模板的点击获得传入链接程序 |
---|---|
漏洞本质 | 函数缺陷导致的xss漏洞 |
缺陷函数 | filter_var函数 |
攻击类型 | 绕过检验 |
程序采取了两种过滤:
-
Twig模板中的escape过滤。关于过滤详见:Twig中文文档
这里面有一句话:Internally,escape
uses the PHP nativehtmlspecialchars
_ function for the HTML escaping strategy.
意思是使用htmlspecialchars函数。即转义特殊字符为实体 -
get传入的值用filter_var函数过滤。 这里设置的参数为FILTER_VALIDATE_URL。即这里判断传入的是否是url。如果成功,返回已过滤的数据,失败返回false。(伪协议可以绕过此过滤)
针对这两种过滤,思路是使用不带特殊字符的xss payload。考虑伪协议绕过
攻击:
payload:?nextSlide=javascript://comment%250aalert(1) |
---|
使用js伪协议确保代码无特殊字符不会被转义,且可以绕过filter_var函数的检验。//是单行注释,注释掉后面的内容,再使用%250a——编码%后的%0a,对代码换行。//注释不掉攻击代码,构成xss漏洞,这时只需点击< a > 标签中的链接Next slide即可触发。
DAY 3
程序本质 | 检测是否存在某种控制器(类) |
---|---|
漏洞本质 | 用户可以操纵可控变量 / 函数缺陷导致的文件包含漏洞 |
缺陷函数 | class_exists函数 |
攻击类型 | 绕过检验 |
本程序含两个漏洞:
- 用户可以操纵可控变量
很不幸,在本程序中,实例化类的类名,与参数均在用户的控制中。我们可以构造任意危险函数来攻击程序,例如xxe攻击,命令执行攻击(前提是安装了PHP拓展插件expect) - 函数缺陷导致的文件包含漏洞
class_exists函数在默认情况下,如果程序中含有__autoload函数,会自动加载。很不巧,文件包含漏洞就出现在此了。我们控制类名为路径。即可使用路径穿越包含任意文件。构成文件包含漏洞
DAY 4
程序本质 | 带过滤的用户登陆 |
---|---|
漏洞本质 | 函数缺陷导致的漏洞 |
缺陷函数 | strpos函数 |
攻击类型 | 绕过检验 |
本程序使用!strpos过滤<>,但是未考虑字符串头字符即为<>的情况。因为此时返回下标0,0和未匹配到false的反均为true。所以我们只需构造payload的字符串首字符为<>即可绕过。
攻击:
payload:username=<"><injected-tag%20property="&pass=<攻击代码> |
---|
DAY 5
程序本质 | 带过滤的邮件发送 |
---|---|
漏洞本质 | 函数缺陷导致的文件包含漏洞 |
缺陷函数 | escapeshellarg、escapeshellcmd函数 |
攻击类型 | 绕过检验 |
代码审计,此程序检验邮件发送的各参数正确。代码先使用filter_var函数确保post传过来的值为邮件。并用escapeshellarg函数,处理特殊字符。看似没有问题。但是此程序存在一个隐含的漏洞。
mail函数的内部是使用了escapeshellcmd函数的,而escapeshellarg函数与escapeshellcmd函数组合,会发生逃逸单引号的问题!
攻击:
payload:=“abc@123.com”,“abc”,“hello world”,"-f aaa@123.com" |
---|
escapeshellarg函数与escapeshellcmd函数组合详见超链接
DAY 6
程序本质 | 创建、删除文件 |
---|---|
漏洞本质 | 正则过滤缺陷导致的目录遍历漏洞 |
缺陷正则 | /[^a-z.-_]/ |
攻击类型 | 绕过检验 |
在删除方法中,使用正则/[^a-z.-_]/,删除文件。即删除除了(a-z字符, .到_的)所有字符,所以这里可以用…/的方法进行路径穿越,删除任意文件
攻击:
payload:action = delete&data = …/…/config.php |
---|
DAY 7
程序本质 | 带登陆验证的连接mysql服务器程序 |
---|---|
漏洞本质 | 函数缺陷导致的变量覆盖漏洞 |
缺陷函数 | parse_str函数 |
攻击类型 | 变量覆盖 |
parse_str函数的第一个参数如果是query string,则会将它解析为变量并设置到当前作用域,实际上,这很像一个注册全局变量的过程。
该程序原本的意思是获取浏览器url并解析url,用一个数组返回其组成部分。调用数组中的query,并解析成变量。但实际上这里被设置为全局变量。我们覆盖mysql的host即可实现变量覆盖,远程连接到我们的数据库中,绕过登陆验证,进行攻击。
攻击:
payload=?config[‘dbhost’]=127.0.0.1&config[‘dbuser]=root&config[‘dbpass’]=root |
---|
DAY 8
程序本质 | 正则过滤变小写 |
---|---|
漏洞本质 | /e模式修饰符下存在代码执行漏洞 |
缺陷函数 | preg_replace函数 |
攻击类型 | 绕过检验 |
实际上,/e模式修饰符已经被弃用,因为如果设置了这个修饰符,preg_replace函数,会对替换后的字符串,用eval函数的方式,作为php代码评估执行。所以此时很容易存在漏洞。
通过代码审计可知,preg_replace函数的第一个,第三个参数均可控,而第二个参数采用了反向引用的方式,实际也可控。因为strtolower("\1")实际上就是反向引用第一个参数。
攻击:
payload:\S*=${phpinfo()} |
---|
即 GET 方式传入的参数名为\S* ,值为 ${phpinfo()}。所以这里会直接eval(phpinfo()),构成代码执行漏洞
preg_replace函数与代码执行详见超链接
DAY 9
程序本质 | 调用文件 |
---|---|
漏洞本质 | 函数缺陷导致的文件包含漏洞 |
缺陷函数 | str_replace函数 |
攻击类型 | 绕过检验 |
str_replace函数,算老生常谈的话题了,在文件上传等各种情况,如果使用了str_replace函数过滤某个字符串,通过双写字符串即可绕过,进行攻击。算是一种逻辑缺陷的漏洞。
DAY 10
程序本质 | 辨别pi |
---|---|
漏洞本质 | 未适当退出程序导致的代码执行漏洞 |
缺陷思想 | 在程序完成过滤时,未立即退出 |
攻击类型 | 硬刚过滤 |
当看到extract函数时,我们很容易把它联想到变量覆盖漏洞上。实际上,本程序存在过滤行为,但很可惜的是,过滤处理完成之后,没有立即退出。程序会继续执行。所以我们直接构造简易的payload,即使其被过滤,但未退出,仍然可以执行
攻击:
payload:pi=phpinfo() (post) |
---|
DAY 11
程序本质 | 写入文件 |
---|---|
漏洞本质 | 反序列化漏洞 |
缺陷思想 | 变量可控 |
攻击类型 | 绕过过滤 |
审计代码发现unserialize函数的变量可控,所以我们思考两个变量的代码应该如下:
序列化后的结果:
但是如何绕过过滤,笔者技术有限,暂未弄懂,在这里直接放出payload,学会了,再来更新
DAY 12
程序本质 | 输出一个链接 |
---|---|
漏洞本质 | 函数缺陷导致的xss漏洞 |
缺陷函数 | htmlentities函数 |
攻击类型 | 硬刚过滤 |
跟踪变量,发现其是可控的,虽然其经过htmlentities函数,但是,该函数的特性是,单引号、双引号都需要单独控制第二个参数来实现,所以这里我们直接构造payload,在< a >标签中,执行xss
攻击:
payload:?a’onclick%3d alert(1)%2f %2f=c |
---|
DAY 13
程序本质 | 登陆验证 |
---|---|
漏洞本质 | 特定条件下的字符逃逸 |
缺陷思想 | 反斜杠逃逸 |
攻击类型 | 绕过检验 |
审计代码,发现先针对输入的数据用addslashes函数处理,再截取前二十位,所以我们思考,在payload中构造字符串,逃逸反斜杠,使sql语句失效,从而造成绕过,sql注入攻击成功。
攻击:
payload: user=1234567890123456789’&passwd=or 1=1# |
---|
1234567890123456789’ 共20位,user传入的时候,被addslashes函数处理,添加\反斜杠,所以此时user的值为21位 1234567890123456789’
被处理时,截断前20位,所以返回的user值为 1234567890123456789\。
此时的sql语句为 select count§ from user where user = '1234567890123456789\ ’ AND password = ‘or 1=1#’
这里的sql语句由于反斜杠的原因,单引号失去作用。user值即为’1234567890123456789\ ’ AND password =’,passwd值为 ‘or 1=1#’
保证了带入数据库查询的结果为TRUE,通过验证。
DAY 14
程序本质 | 文件写入 |
---|---|
漏洞本质 | 变量覆盖导致的任意路径穿越漏洞 |
缺陷思想 | 用户可控变量 |
攻击类型 | 变量覆盖 |
代码审计可知,用户可以直接控制写入函数的位置,通过控制,file_put_contents函数的两个参数,直接导致任意文件写入的问题
攻击:
payload:id=…/var/www/html/shell.php&shell=’,)%0a<?php phpinfo();?>// |
---|
DAY 15
程序本质 | 登陆验证 |
---|---|
漏洞本质 | 缺陷函数导致的网址重定向漏洞 |
缺陷思想 | $_SERVER |
攻击类型 | 绕过检验 |
$_SERVER[PHP_SELF]获取当前执行脚本的文件名,特别注意:如果PHP以命令行模式运行,这个变量将包含脚本名。所以我们考虑控制变量,可以发生重定向任意网址的漏洞。因为url变量用urldecode函数处理了一次,浏览器本身会解码一次,所以我们构造payload时注意将斜杠url编码两次,这样才能绕过explode函数
攻击:payload:
http://www.test.com/index.php/http:%252f%252fbaidu.com?redirect=123¶ms=456 |
---|
DAY 16
程序本质 | ftp连接认证 |
---|---|
漏洞本质 | 代码执行 |
缺陷思想 | 程序未过滤适当的变量 |
攻击类型 | 绕过检验 |
这里很雷的一个点是,代码处理了get、post、cookie传过来的数据,却未处理request获取的mode变量。并且这里使用==弱比较。所以直接构造payload
攻击:
payload:?mode=1%0a%0dDELETE%20test.file |
---|
DAY 17
程序本质 | 登陆验证 |
---|---|
漏洞本质 | 特定条件下的字符逃逸 |
缺陷思想 | 反斜杠逃逸 |
攻击类型 | 绕过检验 |
程序大体与DAY 13相同,不同之处在代码针对用户输入 password 的值调用 md5 函数进行相关处理。并且这里设置第二个参数的值为true。那么此时,MD5报文摘要将以16字节长度的原始二进制格式返回。思路与DAY 13相同,构造payload最后一位为\,使单引号失效。
通过对1-1000fuzz发现,md5(128,true)的结果带有反斜杠。
攻击:
payload:user = OR 1=1#&passwd=128 |
---|
总结
- 总结缺陷函数,在审计代码时,可以通过缺陷函数思考有无对应攻击
- 基础不够夯实,有些程序还无法理解作用
- 通过可控变量实现xml攻击的payload还不会写,会进一步学习
- 对于一些绕过检测,可以通过burpsuite,fuzz跑一下,看返回值不同,先确立答案。然后再求解
- 第一次写技术分享类博客,很多写的不好的地方,希望继续加强。
来源:CSDN
作者:努力学习的警校生一枚
链接:https://blog.csdn.net/weixin_44599080/article/details/104114858