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编码的关键词即可,如下截图所示,直接运行即可得到编码后的结果。
内联注释绕过
内联注释绕过如下,也就是利用该注释绕过后端程序的检测。
id=1 /*! and*/ 1=1
空格替换
很多时候web服务器端会将用户输入的空格过滤掉,所以此时在注入sql语句时就无法使用空格作为分隔符,而需要用其他字符来代替空格的功能。
# 使用小括号代替空格
select(first_name)from(users);
总结
不忘初心,砥砺前行!