【PHP代码审计】Bluecms代码审计
一、前端SQL注入 - ad_js.php
漏洞点在如下位置:没有进行过滤或防护直接拼接sql语句
但是在上面包含文件/include/common.inc.php
中,存在对GET、POST、COOKIE使用addslashes 进行的统一过滤
1 | function deep_addslashes($str){ |
因此,单引号、双引号、反斜杠在get、post、cookie中将被转义。
此时的绕过方式也有很多:
- 使用十六进制编码
- 此cms使用了gbk编码,通过宽字节来绕过
在$db->getone()的底层使用的是mysql_query
1 | function query($sql){ |
二、insert型SQL注入
在/inlude/common.inc.php
中,发现get、post、cookie 都经过了addslashes 的过滤,作为白盒测试的我们,发现数据库中存储了IP的信息,会不会有存储IP的地方没有经过addslashes 的过滤呢?全局搜索ip
果然,找到一个getip 的函数,顺着往上找
在comment.php
中,存在一个insert 的SQL语句,其中使用了getip()函数,
三、用户登陆SQL注入
看用户登陆的user.php
的$act == 'index_login'
内容,登陆校验在user.fun.php
文件中,重点代码如下:
1 | function login($user_name,$pwd){ |
当我们知道用户名之后,在密码的位置可以使用万能密码进行登陆,这里使用宽字节绕过addslashes 函数
1 | user_name=test&pwd=%df') or 1=1 %23&x=26&y=8 |
四、文件包含漏洞至Getshell
在user.php
的750行中,如:
1 | elseif ($act == 'pay'){ |
这里post提交的pay 没有进行任何的过滤,则可通过目录穿越和截断实现任意文件包含
如果php版本低于5.3.4
且magic_quotes_gpc=off
则可以使用%00
截断。还可以使用系统文件路径长度限制来进行截断
这里已经包含了根路径下的index.php 文件,现在来包含根路径下的1.txt,使用系统文件路径长度限制来绕过。这里依然有个前提,我看很多博客上面都没有提到系统文件路径长度绕过的限制,导致复现不成功,这里的php版本需要小于5.2.8
这样,我们可以联合图片上传来getshell
找到图片位置进行包含并执行命令
五、任意文件删除
database.php
文件中存在该漏洞
很明显,漏洞原因是没有对$file_name
做充足的校验
删除前根目录
访问:http://192.168.137.48/bluecms/admin/database.php?act=del&file_name=../../../../../../../../1.txt
删除后根目录
六、存储型XSS
这个有点多,简单分析一处
在user.php
新增文章这里
不过这里使用了一个filter_data 函数做了一个过滤
1 | function filter_data($str) |
但是这个正则是可以绕过的,如使用img标签
1 | <img src=1 onerror=alert(1)> |
七、总结
这个bluecms有博主共计74处漏洞,更多的漏洞就暂时不看了,这里贴上这位博主的文章:Bluecms 1.6 代码审计过程(共计 74 个漏洞)-CSDN博客