在注入之前,我们要明白两件事情,那就是数据库类型、提交方法,因为数据库类型不同的话,注入方法也不同。
#简要明确参数类型
数字、字符:非数字就是字符,字符的输入是要用引号括起来,这个时候我们在注入的时候,就需要考虑到符号的问题。如果我们输入字符串,没有使用单引号括起来,那就是单纯的输入字符,这是没有意义的,形成不了逻辑判断。
如果在实战当中,我们看到数字型的输入,也有可能是字符型的,因为它输入的时候,后台可能用单引号进行包裹,注入类型是什么要看后台的一个SQL语句的写入。如果是字符串的话,那必须是字符型的,因为它不可能在没有带入单引号的情况下就直接带入到sql语句中去执行。
我们对字符型注入进行测试的时候,必须要把单引号给闭合掉,可以使用’ , " , %, ), }等,具体需看后台的写法。一般后台是采用单引号。
搜索:电脑当中的搜索语句和sql语句当中的搜索不一样,sql当中采用的是百分号,我们电脑当中的搜索语句的通配符是*。
sql语句的搜索语句是这样子的,‘%shantu%’。所以我们在过滤的时候,要过滤单引号和百分号,不然我们注入的语句会全部在’%%'符号里面。
网站根据实际的应用,一些参数的类型,它的语句规定必须要用单引号或者其它符号括起来的,因为我们知道在程序开发里面,数值是不需要单引号、双引号括起来的,而字符必须要用单引号或双引号括起来,这样才是字符串。不然会被误认为我们写入的东西是它内置的函数或者其它的东西。在做搜索功能的时候,语句必定是有一个’或%。
我们只有通过尝试才会知道程序是用什么方法来进行闭合,而组合只有那几种,我们去尝试就会发现。一般在相关的注入工具里面,会有大量的字典去尝试可能性,人工的话,就需要大家自己去知道有那几种。
JSON等
GET,POST,COOKIE,REQUEST,HTTP头等
其中SQL语句干扰符号:’ , " , %, ), }等,具体需看写法
不同的请求方法,它的请求类型和数据大小是不一样的。我们在注入的时候,我们需要按照它的请求方法来进行注入。如果没有按照它的请求方法来注入,会造成请求数据传不上去,会造成注入语句无法带入数据库里面去,注入就无法攻击成功。
我们需要知道对方的请求方法,然后在对方的请求方法里面,去带入数据。我们不要按照常规的测试,不管三七二十一的往里面敲,那是不行的
在不同的脚本里面,例如python、java,接受参数名并且赋值给变量的写法是差不多的。
例如一个参数,它的传参是post的,但是你用get的方式传参给参数,那么这个参数是得不到这个值的,也无法将这个值赋值给变量,除非你后面改成post传参。
get型传参有一个特殊点,它就是不管你是以什么方式传参,只要你是在网址后面进行传参那么它就会收到。
在接收数据这一块可以接收get、post,还可以接收Cookie这一栏的,同样的道理,它还可以接收其它的。
request代表接收任何请求方式的传参
我们网站在访问的时候,由于我们自己大部分是黑盒测试,我们不知道对方代码的一个写法,那我们就不清楚它在接收数据的时候,是采用单个接收的模式还是全部接收的模式。如果说对方是采用request的接收方式,我们就不要去纠结用何种方式去提交了,因为我们不管用何种方式去提交,以get、post、cookie都可以,但如果说对方是采用单一的接收方式,比如只接收get方式,那我们在注入的时候,就必须要用它相应的方式去注入。我们在实战的情况下,尽量使用它的原始方法去注入。我们说的以其它提交方式去注入,主要是用来绕过相关的防护软件可以使用更改提交方式,有的防护软件,它只对某个提交方式的数据进行过滤,它不会对其它方式进行过滤。
对一个网站使用get方式去访问的时候,它是正常的,然后我们去测试它能不能用其它方式去传输,使用post方式去传参,如果这个时候,网站没有任何反应,还是以前的页面,就表示这个参数,它能够以post方式去接受,所以这个时候,我们就可以把这个注入,用post方式去注入。
$s=$_SERVER['HTTP_USER_AGENT'];
判断是何种设备访问的,手机的话,就给你手机模板的页面,是pc的就给pc的页面。如果获取这些信息有进入到SQL语句中去查询、保存和操作的话,也会造成相应的注入漏洞
HTTP头部注入,在http数据包里面的注入,数据库有接收数据包里面的某个地方,然后我们把注入语句写到相应的地方进行注入即可
对字符串类型的sql注入,测试语句应该是这样子的,1’ and ‘1’=‘1;如果你用的是1’ and 1=1,那在拼接到后台的时候,会多出一个单引号,导致sql语句报错,我们的测试语句就不会在后台执行。例子展示
?id=1' and 1=1
SELECT * FROM users WHERE id='1' and 1=1' LIMIT O,1
?id=1' and '1'='1
SELECT * FROM users WHERE id='1' and '1'='1' LIMIT O,1
1’ and ‘1’=‘1和1’ and ‘1’='2返回的是不同的页面,那就是说明存在注入,其中的2指的是输入不相等的数字
我们在注入的时候要搞明白单引号对注入的影响,闭合单引号的方法
1’ union select 1,2,3 and ‘1’=‘1
报错注入,看一下会不会有数据被报出来
-1’ union select 1,2,3 and ‘1’='2
注释符的意义在于闭合掉后面的干扰
-1’ union select 1,2,3–+
-1’ union select 1,2,3#
测试的SQL语句其实怎么写都可以,就是你会不会弄明白的问题。在注入的时候要考虑闭合符号的问题
我们做白盒测试的时候,看的代码知道是双引号,我们测试的时候,可能就需要都去测试一遍,因为他的可能不是很多,我们手工是能够测试的出来。反正测试就完了,没有什么好讲的。
参数类注入的时候,要保证前后语句的闭合,就能保证注入出一个正常的东西,不然的话,没有把双引号这些东西给闭合掉的话,那么SQL语句都会写到双引号里面去,起不了任何作用。
在注入的时候,要明确注入的类型在去注入,因为参数类型的不同,可能会涉及到一个符号,而且数字型大部分是没有符号的,只是我们这边演示的案例都是有符号的,那是另外一种情况。
如果是字符型肯定是有符号的,就看是什么符号了,因为字符必须是单引号双引号括起来这个语句才会正常。而数字型他可以选择不用,不用的话,我们在注入的时候就可以不用考虑到符号。
网址没有任何参数,也有可能存在注入,因为数据不仅可以通过网址提交,还可以通过登录框提交,后台在进行用户登录的时候,会接收我们输入的数据,他会把输入的数据储存在数据库里面,通过对比我们输入的数据是否在数据库里面存在,才会返回一个正确或错误的值,在这个过程中就满足了SQL注入的条件,有数据的接收和数据的查询。post注入经常产生的地方就是在登录框
这个数据是我们在网址上面看不到的,需要我们抓包去分析这个数据的提交
在数据包里面,用户登录数据以post方式去传输,我们对post数据包进行SQL注入测试时,我们可以使用hackbar工具进行测试,但还是更推荐用BP去进行测试。
我们对数据进行注入的时候,要考虑到两个类型,一个是提交方式,一个是参数类型。账号密码不可能是纯数字,大部分的账号密码都是字符串,既然是字符串,那百分百是有符号干扰你的。先加单引号测试一下,xx’ and 1=1–+,看一下正常的情况,xx’ and 1=2–+,如果是没有任何变化的话,有可能是注释符号没有起到作用,我们可以切换成#,在看页面会不会发生变化,如果没有的话,可能就是没有注入
xx’ order by 3–+
xx’ union select 1,2#
xx’ union select databases(),2#
–+和#这两个注释符号,有时候一个行,另一个不行,是根据SQL语句决定的,注入的时候,试一下就完事了。
当判断完数据显露的位置,就可以开始猜数据了。猜完数据库名,就可以开始猜表名、列名,数据。
在实战当中要花大量的时间去手工测试,大部分情况下会使用工具。很多工具在跑注入点的时候,他会存在误报或者跑不出来的情况,但是我们在通过手工注入测试的情况下,我们能够准确的认识到这是注入,但是工具就是不知道,就是跑不出来。工具跑不出来的原因是多方面的,可能是没满足什么条件,检测机制里面没有这种情况。这个时候,就需要用到我们手工注入学习到的相关知识点了。就能够写脚本或者二次开发一下sqlmap,来实现这个配合注入。
我们学习手工注入,就是为了实现工具注入不了的一些事情,在配合工具修改脚本;我们不学习手工注入,就搞不清楚注入的原理。
cookie注入可以运用在防护突破上,有时候waf的大的过滤机制,是针对某个提交方式,可以利用数据的更改提交方式绕过,如果它针对的是post,那我们就可以使用cookie的提交方式进行绕过。
Cookie: uname=admin’ AND 1=2 union select database(),2,3#
在进行注入测试的时候,要注意到数据包的时效性,有时候时效性过了,数据包就会无效,不被后台接受。
目前网站IP判断由两种形式实现,一种是借助系统上面自带的协议,IP策略那些东西。通过脚本获取IP地址,这种IP地址一般是可以伪造的。但如果是采取系统层面的地址获取的话,那个IP地址就是我们常说的公网IP地址。这种IP地址我们就不可以伪造,只能通过代理IP来更换,因为这种IP地址是运营商提供的,但是这种脚本获取IP地址是可以伪造的。
网上的扫描工具都是基于数据包去实现的,扫描工具在扫描注入点的时候,就不会像我们在网站地址上做文章,它直接在参数里面一个个试。手工的话,我们就抓包测,工具大部分是基于数据包的发送提交去测试的
json={“username”:“Dumb’ and 1=2 union select 1,database(),3#”}
json的写法有点类似于我们开发的列表
user=xiaodidasd
{
‘user’:‘xiaodi’,
‘pass’:‘xiaodi’
}
把注入的值写在xiaodi里面就完了。json注入就是格式上的不同,按照它的格式去提交就可以了,json最喜欢出现的地方就是app里面,基本上app的很多数据,都是json提交的。
json数据不仅是app、web里面经常有,这个具体要看网站情况,不是说百分百的,但是app里面是最多的。
通过抓包,去分析它以什么形式去提交数据的,那么我们在注入的时候,也要按照相应的提交方式去注入