初识代码审计,先学习bluecms,这个系统因为比较老,所以相对而言比较简单
系统搭建
该系统的下载地址:https://github.com/source-trace/bluecms,先把源码下载到www的目录下:
访问http://localhost:90/bluecms/uploads/install
然后安装程序(ps:这里phpstudy搭建的bluecms所用的apach版本要低于7才可以)
安装后访问http://localhost:90/bluecms/uploads
,即可来到登录页面
第一个xss
这里有用户名和密码,弱口令和sql注入都可以尝试下,但随着安全意识提升,这种登录口的漏洞越来越少,我们尝试这里的注册点:
这里需要我们写入个人信息,关键点:这里可能存在存储型xss,我们填入信息:
我们如果直接向其中一个信息字段写入xss的内容,可能会被前端给拦截,我们赌它后端不会被检测,使用抓包软件修改字段内容再发送,加入该xss字段:<script>alert(1)</script>
我们使用这个账号进行登录:
查看源码:
成功写入,存在存储型xss漏洞
sql注入漏洞(宽字节)
观察到uploads目录下有admin文件,访问该目录:
测试语句:admin' or 1=1 --+
,admin or 1=1 --+
也不行,那就看下源码:
这里用到了check_admin
函数校验,我们去看下它的执行逻辑,跳到common.fun.php
文件:
这里有一个全局类对象global $db
,然后调用getone
方法判断输入是否合法
我们需要要找到这个对象从哪new得到的,在当前文件查找include关键字,没找到,不过在login.php找到了包含/include/common.inc.php
然后果然在/include/common.inc.php中找到了$db的所属类:mysql
还发现了一个对输入参数的过滤:
get_magic_quotes_gpc()
是 PHP 5.4 之前的一个函数,用于检测是否启用了 magic_quotes_gpc
(自动对用户输入转义的功能)。
如果返回 false
(未启用),则手动调用 deep_addslashes()
对输入数据转义
deep_addslashes()
- 是一个自定义函数(递归处理数组的
addslashes()
),作用是为特殊字符(如单引号'
、双引号"
、反斜杠\
)添加反斜杠转义。 - 例如:
I'm
→I\'m
,防止 SQL 语句被恶意闭合
deep_addslashes()
的处理逻辑:
1 | function deep_addslashes($str) |
找到了这些之后,我们还需要找到mysql类的初始化定义,发现在mysql.class.php
文件中
不过我们注意到使用了gbk编码,而这很容易导致宽字节注入,宽字节注入的两个条件就是1.数据库使用GBK/GB2312等多字节字符集,2.使用了不安全的转义函数,显然这里同时满足,可以宽字节注入的原因:如果我们使用'
闭合,那么系统会给我们加上一个转义字符\
,使'
成为普通字符,但如果我们在'
前面加上%df
,而\
的ascii(gbk)编码是%5c
,拼接在一起就是%df%5c'
,因为gbk的编码字符涉及到汉字编码非常广泛,所以会将%df%5c
视作一个汉字運
来解码,从而单引号逃逸,构成宽字节注入
我们尝试宽字节注入:%df' or 1=1 #
,这里用--+
不行,不知道为什么,但没关系,我们先在前端提交,密码随便输:
发现失败大概率就是因为经过这里有特殊字符,经过url编码,后端解码得到的字符不是我们最初的构造字符,所以失败,对于这种,一般在抓包软件中提交,这样不经过前端校验,直接由后端处理
当然并非只有这一种形式构造,还可以:%ef' or 1=1 #
,只要%ef和%5c经过gbk编码可以得到一个汉字即可
第二个xss
根据源码,我们找到/bluecms/uploads/admin/ad_phone.php
,写入xss内容: