SQL注入的提交方法和注入类型
提交方法和注入类型
注入漏洞的原理:将数据带入数据库查询,查询出相应的内容,但是我们在这个基础上进行修改了。
提交方法
对于PHP的代码
$name = $_GET['x'];
$sql = "select * from user where name = '$name'"; // 这是字符型的
在带入数据库查询的时候,加不加()都是一样的,在数据库中%是通配符。
?x=myname and 1=1
select * from user where name = 'myname and 1=1' # 由于单引号的存在将这个and当作字符串处理
select * from user where name = ('myname and 1=1') # 多尝试,数据库的查询语句不唯一
# Like语句,模糊查询
?x=mypage
select * from user where name like '%mypage%' # 使用%作为通配符类似于* 写法不唯一
简要明确请求方法
-
GET
就是通过,浏览器的URL进行参数的传递。传输的数据一般较小。
GET请求的话不考虑请求头是GET还是POST。
/?get=123 -
POST
POST请求可以传递很长的数据,不是通过URL进行传输的,传输的数据可以很大。
post请求数据包,get请求数据包的话不变直接burpsuite提交即可
POST请求需要间隔一行进行写数据
post=数据POST数据注入提交注入测试=>sqlilabs less 11
-
COOKIE
Cookie: cookie=123123 # 在BurpSuite中需要这样写COOKIE数据注入提交测试=>sqlilabs less 20,这个就是绕过了POST请求。使用COOKIE注入的
使用Cookie注入的话,会有奇效,有时候可以绕过有一些防护,例如相应的魔术引号,less 20就是这样的
-
REQUEST
可以接受GET,POST,COOKIE请求的数据,但是在接受COOKIE数据的时候,需要在PHP的配置文件中开启request_order,默认是request_order=“GP”,并不包含C也就是Cookie,需要加上C,才可以接收COOKIE传递的数据。
由于我们大多数的情况下都是黑盒测试,如果对方使用request的方式进行提交数据的话,就不需要考虑对方相应的方式,因为get,post,cookie都可以。
如果get和post分别提交,页面是一样的,那么就是request方式去请求
-
HTTP头等,例如:User-Agent等
抓包之后直接修改数据即可。
对于PHP来说,
$_SERVER,是PHP内部的一个预定义变量,可以获取相应服务器的资源信息,进行注入,可以获取你的IP地址等等之类的。HTTP头注入,发生在HTTP头中,可以是User-Agant中,and so on只要是将注入语句插入到数据库中的地方都可以使用这种注入方式
HTTP头部数据注入测试=>sqlilabs less 18
-
GET请求如何与POST请求相互转化:
比较两个请求的不同:
不同部位:头部GET/POST
缺少的部位:Content-Type、Content-Length、Origin、post传参内容
第一步:改请求头第一行,把GET改成POST
第二步:中间添加2行参数
Content-Type: application/x-www-form-urlencoded Content-Length:(请求的内容长度)一般是8 # 参数和值之间要有空格第三步:末尾空一行,写POST参数,结合实际情况,用参数名=参数值的格式构造参数(中间不能用空格),多个参数要用&隔开。
一般情况下修改提交方式进行的注入,不需要进行测试那么多,一般get,post测试就可以了,但是有时候为了绕过一些WAF之类的可以修改提交方式进行绕过。
注入类型
一般情况下都是字符型的,因为无论你类型,数字也好,字符也好,通过WEB的URL传递的数据都会变成字符。
注入类型有字符型和非字符型。
这两种是数字型的
select * from user where id =1
select * from user where id = '1' # 这两个是相同的效果
这种是字符型的
select * from user where name = "Love"
简要明确参数类型
-
数字
-
字符
参数字符型注入测试=>sqlilabs less 5 6
-
搜索(就是%匹配的)
-
JSON等
没有环境,但是和其他类型的注入是同一个方法。
JSON方式的注入,直接注入就行了,和上面的方法类似,这种一般存在于APP中
eg:
json={"username":"Dumb" and 1=2 union select 1,database(),3#}eg:
a=1 and 1=1 & b=2 &c=3 // 普通的注入类型 { // JSON注入类型 "a":"1 and 1=1", // 这个""是不需要闭合的 "b":"2", "c":"3" }
在注入的过程中可能会有干扰符号,其中SQL语句干扰的符号有’,",%,),}等,具体绕过,需要看写法,自己多尝试,例如将and 1=1当作字符串处理了,如果对方的SQL语句中是select * from user where id = '1'将and 1=1当作字符串带入数据库进行查询就出错了,需要闭合'