一、编码问题 http在传输特殊字符时需要在浏览器中编码,常见比如空格,回车符等。编码是有规定的,但是具体怎么编码没有规定,不同的浏览器 的编码方案不一致,不同字段的编码方案也不一样 二、实际测试 当你对浏览器的输入区域,输入字符,那么会出现两种情况 1.输入的字段被浏览器自动编码,比如说空格,浏览器会自动编码成20%,传输时也是%20进行传输的 2.输入的格式是编码形式,浏览器自动还原为解码形态,传输时http是解码形态,比如输入%61,浏览器自动还原成a,传输时也是a 三、编码对我们的意义 1.绕过对于一些特殊字符的限制,比如:单引号过滤时select name from users where user = 'admin’由于’dimin’会过滤为admin,从而 导致user=admin出现语法错误。 2.后台对于输入的判断一般时两种顺序 先解码,后过滤 ——>执行sql //此顺序编码绕过无效 先过滤,后解码 ——>执行sql //此顺序编码绕过有效 3.waf 先解码,后过滤——>传输 //不能绕过 ------ 这种情况可以通过二次编码绕过 先过滤,后解码——>传输 //可以绕过 四、关键字过滤 1.混淆 如果后台吃掉关键字,and可以变成anandd,吃掉中间的and,最后还是and 如果后台匹配不完善,也可以大小写混淆,And,AND,anD之类的 2.替换 替换能执行相同功能的关键字或者函数,比如and——&&,or——||,注意&&会被浏览器转码,需要输入时先编码%26,=可以通link 3.编码 全编码 admin——>%61%64%6D%69%6E 部分编码 admin——>%61dmi%6E 五、特殊字符过滤 空格替换: 1.空格的替换,空格时特殊字符,可以找其他特殊字符替换,%a0和%0b在sql-labs有效,其他环境其他字符也能有效,需要测试 2.空格的间隔作用,还可以用内联注释取代,order by为例:内联注释以这么写:
/*!order*//*!by*/
3.空格的间隔作用,还可以用注释取代,order by为例内联注释可以这样写,
order/**/by/**/
逗号替换 from for 注释#的替换,构造永真 or ‘1’ = '1
六、单引号转义----双引号等字符闭合都一样 单引号转义实 ’——>',意味着‘号时效变成普通字符,我们有两种手段 1、如果 \ 没有被过滤或者转义,我们可以输入\ ’ 来抵消: '——>\’ 这里面中间的\被第一个\转义从而使得’有效 2、如果 \ 被过滤或者转义,我们可以使用宽字节注入来实现单引号的有效化,具体是如果数据库的表或者数据库的编码是GBK,GB2312, GB18030是可以实现汉字双字节编码的,我们利用 \ 编码是%5c在其前边添加一个%81-%fd的编码,就可实现宽字节编码,比如%81%5c 是’乘‘字,这样单引号就不会被 \ 转义,从而顺利构造闭合
|