auxblog CMS 1.0.6 审计记录

前言

最近新搭建了博客,把老博客的文章全都整合搬到了新博客。

​ 这次审计了下11月1日更新的auxblogcms,目前审出了3个危害大的漏洞.写完文章再深入下去.通杀1.0.6全版本#

​ 下载地址:http://www.axublog.com/post/axublog_jian_zhan_xi_tong_update_download/

后台Cookie绕过

​ 这个,在1.0.5也出现过.但是不知道为什么到现在还没有修复.

ad/admin.php 后台首页,我们来看下这块.

在后台首页这块,我们可以看到,引进了all.php中的chkadcookie()函数,用来检测管理员是否已经登录.

我们跟进去.

我们在admin.php中并未看到这个函数的定义,那么应该是在admin.php中引入的其他文件中.然后,一路追踪到了c_login.php中看到了chkadcookie()函数的定义.

c_login.php 第6行

关键这行代码

if(@$_SESSION["chkad"]==''&&@$_COOKIE["chkad"]==''){
header("Content-type:text/html; charset=utf-8");
echo '<div id=redmsg>请<a href="login.php">请登录</a>。。。</div>';tiao();
exit;
}

我们可以看到,检查管理员是否登录第12行的判断出现了问题,只是单纯的判断session和cookie中的chkad参数是否为空,如果为空就跳转提示请登录.第二个判断只是判断cookie传过来的user-agent头是否与txtchkad.txt中的user-agent头是否相等,若相等就跳转,提示未登录.由此,我们只需要前端直接输入后台功能处的地址再添加chkad=随意字符,就能登录后台了.

感谢白帽子RcoIl 指正,在上面传入chkad中chkad不能为任意字符,应为txtchkad写入文件中的某个字符.

在整段if判断之前,有一段替换,

$txtchkad2=str_replace(@$_COOKIE["chkad"],'',$txtchkad);

 

Cookie中的chkad传入进来先会进入一次替换,即在txtchkad中匹配由前端传进来的chkad的值,如果匹配到,替换为空.再进行下一段逻辑判断.

所以这块chkad的值我们必须为$txtchkad写入的User-agent头中的任意值,这样才能绕过.

先前chkad=1绕过,是因为User-agent头中有数字1的存在,所以在写文章的时候复现成功.

本地测试

​ 浏览器定位到http://xxx.com/ 后台地址/index.php,然后抓包,添加cookie值:chkad=任意值

前台反射XSS

​ 存在位置 go/index.php

a) 我们可以看到,接受get传来的u变量,但是未进行任何过滤.直接echo给location.href语句了.由此,我们可以构造payload绕过.

b) 直接逃逸双引号,闭合前面的语句即可造成xss

</script><script>alert(1)</script><script>

c) 复现

前台一处无限制SQL盲注

问题出现在:hit.php

我们可以看到,在文件头引入了一个sqlguolv()的函数作为waf,过滤用户的一些字符.

class/c_other.php sqlguolv():

Function sqlguolv() {
@header("Content-type:text/html; charset=utf-8");
if (preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',$_SERVER['QUERY_STRING'])==1 or preg_match('/select|insert|update|delete|\'|\\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/i',file_get_contents("php://input"))==1){echo "警告 非法访问!"; exit;}
}

用php://input伪协议来接受$_SERVER[‘QUERY_STRING’]的值,即?后面参数传过来的值.这段过滤在一定的程度上是没有问题的,但是坏就坏在hit.php这一段

过滤函数没有过滤and 和其他可能引起盲注的字符,然后经过过滤函数之后,hit.php直接对sql语句进行了拼接.

select * from axublog_arts where id= $id

 

那么,问题就来了.我们根本不需要使用单引号进行绕过,直接在id后面传入我们要执行的语句就OK了.用最简单的办法and 1=1 ,and 1=2执行boolean blind injection

由此,我们就能构造语句了.写了一个poc,根据网站返回的内容长度来判断语句是否成功.请注意一下,不同网站的返回长度不同.我这里以官方站(http://axublog.com)来做演示

后记

​ 生活为了什么?为了活着!

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注