CTF之web学习记录 -- SQL注入检测绕过

本文总结了CTF中常见的SQL注入检测绕过方法,包括大小写绕过、双写绕过、编码绕过、内联注释绕过和空格替换。通过这些技巧,可以规避后端的过滤机制,继续进行SQL注入攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CTF之web学习记录 – SQL注入基础
CTF之web学习记录 – SQL注入进阶

概述

  在学习了一些基本的sql注入知识以及注入技巧后,本篇博客将会总结一些常见的sql注入检测绕过方法。

大小写绕过

  大小写绕过很好理解,后端程序会过滤掉一些关键词,比如:select/union/and,此时就无法达到注入的效果。想要绕过这种检测,只需要大写某些字母即可,比如:selEct/UniOn/And,之所以可以这样绕过,一是因为后端的检测逻辑不够完善,二是mysql并不区分大小写。

双写绕过

  双写绕过在ctf比赛中十分常见,当我们注入语句id=1 and 1=1,此时返回了报错信息,但信息中却只有1=1,这说明and被过滤了,且一般都是将and替换为空。这里我们就可以采用双写绕过的方式,在关键词中任意一个字母后面插入该关键词,如下面所示:

and --> aandnd
select --> seselectlect
union --> uniunionon
or --> oorr

编码绕过

  编码绕过用于后端程序对关键词存在过滤,同时程序本身会对传入的参数做一次url解码的情况。此时我们可以对关键词进行两次url全编码,之所以要做两次,是因为服务器会自动做一次解码的操作。这里的url全编码是指不光对特殊字符进行编码,而是对所有字符都进行url编码,我在网上没有找到相关的在线操作,所以自己实现了一个,参见下面的python代码。


def url_encode(strs):
    res = ""
    for ch in strs:
    	res += "%"+hex(ord(ch))[2:]

    return res


def url_double_encode(strs):
    res = url_encode(strs)
    res = url_encode(res)

    return res


if __name__ == "__main__":
    strs = "and"
    # 一次全编码
    res = url_encode(strs)
    print(res)
    # 两次全编码
    res = url_double_encode(strs)
    print(res)

  将代码中strs的内容替换为想要进行url编码的关键词即可,如下截图所示,直接运行即可得到编码后的结果。
url_code

内联注释绕过

  内联注释绕过如下,也就是利用该注释绕过后端程序的检测。

id=1 /*! and*/ 1=1

空格替换

  很多时候web服务器端会将用户输入的空格过滤掉,所以此时在注入sql语句时就无法使用空格作为分隔符,而需要用其他字符来代替空格的功能。

# 使用小括号代替空格
select(first_name)from(users);

总结

不忘初心,砥砺前行!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值