代码审计3-熊海cms v1.0
前言
菜狗子学代码审计,只能挑挑软柿子捏一捏了。MVC框架现在估计是审计不出来,只能找找代码流不仅小一点,小型的CMS下手了。所以找了这一套又老有小的CMS来练练手了,目前还是用seay审计系统
先扫描可疑的漏洞点,然后一个一个地去看漏洞涉及的代码,可能菜是原罪吧。
熊海CMS v1.0
任意文件包含
在路径/admin/index.php
中,有一段入口文件代码:
1 | <?php |
这里的变量$_GET['r']
仅仅用addslashes()
函数进行简单的转义,直接进行文件包含,但是在include()
函数里拼接了.php
后缀。所以必须要上传了.php
文件才行。
手动在文件目录下创建1.php
,用r=../1
包含该文件,但是这个貌似有点鸡肋。
如果满足如下条件,就可以利用%00
截断可以进行包含文件进行getshell
- PHP版本 < 5.3
- magic_quotes_gpc = off
- 没有用addslashes()进行转义处理
手动把PHP
版本调到5.2.17
,并且把magic_quotes_gpc = off
,去掉原来代码中的addslashes()
函数处理进行文件包含getshell
。
另外再修改代码测试一下,把拼接部分的php
后缀去掉。然后就可以利用到包含日志文件进行getshell
了。
Payload:r=../../../Apache/logs/access.log <?php phpinfo(); ?>
浏览器会对一些字符进行转义编码,用burp直接发包。
1 | GET /index.php?r=../../../Apache/logs/access.log <?php phpinfo(); ?> HTTP/1.1 |
在路径\inc\checklogin.php
的代码如下:
1 | <?php |
checklogin.php
文件用来检查用户的COOKIE
,判断仅仅是判断COOKIE
是否不为空,所以只要我们伪造任意不为空的COOKIE
值就可以跳过后面的重定向了。
在\admin\files
目录下的所有的文件都是通过require()
函数来包含这个文件进行COOKIE认证的。
1 | require '../inc/checklogin.php'; |
所以我们可以直接伪造任意不为空的COOKIE
值来进行越权访问。
存储型XSS
在每个文章下面是可以进行评论的,提交了一下评论表单,用PHPStorm
调试跟进。发现评论内容是被过滤了的。
在文件\files\submit.php
中:
1 | $content= addslashes(strip_tags($content));//过滤HTML |
但是没有过滤其他的字段,这里仍然可以利用其他字段进行XSS攻击。
利用昵称进行XSS测试。
这里好像把页面的html也插坏了。。
后台管理员界面:
反射型XSS
在路径\files\contact.php
中,
1 | $page=addslashes($_GET['page']); |
这里的$page
是直接仅仅进行了转义,然后直接代入以下的html
代码里。
1 | <a>第 <?php echo $page?> - <?php echo $Totalpage?> 页 共 <?php echo $Total?> 条</a> |
所以可以XSS。
前台多处报错注入
\files\software.php报错注入
在路径\files\software.php
如下代码:
1 | $query = "SELECT * FROM settings"; |
这里的cid
变量通过GET
请求提交,然后通过一个addslashes()
函数进行简单的转义,这样对注入是没有防护作用的。所以可以直接进行注入,这里是通过die('SQL语句有误:'.mysql_error());
输出报错信息,所以是属于报错注入。
\files\content.php报错注入
在路径\files\content.php
代码如下:
1 | $query = "SELECT * FROM settings"; |
这里的cid
变量跟\files\software.php
是一样的。
\files\submit.php报错注入
在\files\submit.php
路径下,有几处SQL注入,有跟前面一样的cid
变量,另外还有下面的mail
变量。
1 | $query = "SELECT * FROM interaction WHERE( mail = '$mail')"; |
这里的mail
变量是POST提交的,没有经过任何过滤,闭合单引号和括号。
1 | 1') and (updatexml(1,concat(0x7e,(select user()),0x7e),1))# |
在评论处,添加评论并在邮箱处插入payload。
提交返回报错信息。
后台报错注入
\admin\files\wzlist.php报错注入
后台也有不少可以进行报错注入的点,这里有一处是利用到delete
语句的。。
1 | $delete=$_GET['delete']; |
直接闭合单引号就可以了,这里也没对单引号进行转义的。
后台的注入在这cms里来看并不是很鸡肋,因为我们结合前面得到的cookie伪造越权访问
在没有管理员账号密码的情况下进行注入。例如:
\admin\files\newlink.php报错注入
1 | $save=$_POST['save']; |
这里是一个利用insert
的报错注入,同样在页面添加友情链接。
1 | ' or (updatexml(1,concat(0x7e,(select user()),0x7e),1)) or' |
保存得到报错信息。
结语
其实还是一套简单的CMS,也是常见的漏洞。代码也比较简单,也没有过多的防护。这里找到的一个cookie伪造越权访问
漏洞,这种是自动审计工具没法发现的点,所以还是需要自己去读代码的逻辑。结合这个漏洞,就可以在没有后台管理员权限的情况下进行后台的SQL注入。所以结合不同的漏洞去得到一个webshell
是需要学习的点。