常用的URL编码有UTF(%xx%xx)和十六进制编码(%xx),大部分IDS和WAF都可以识别并解码,然后再做正则匹配。但是IIS web服务器除了支持这两种编码之外,还支持另外一种非标准的编码,也就是这里说的%u编码(%uxxxx)。更具体的内容可以 查看原文 。不得不说有些技术不会老,关键是你还在乎不。也就是说请求abc.as%u0070,实际上是请求的abc.asp。如果这样的话,在IIS的环境下就是一种绕过的方法,如果你的waf傻傻分不清楚的话。 下面是修改的一个ruby脚本,可以将字符转换为上面的%u编码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 require 'uri' def unicode_url(string) lookuptable = Hash.new lookuptable ={ ' ' => '%u0020' , '/' => '%u002f' , '\\' => '%u005c' , "'" => '%u0027', '"' => '%u0022' , '>' => '%u003e' , '<' => '%u003c' , '#' => '%u0023' , '!' => '%u0021' , '$' => '%u0024' , '*' => '%u002a' , '@' => '%u0040' , '.' => '%u002e' , '_' => '%u0095' , '(' => '%u0028' , ')' => '%u0029' , ',' => '%u002c' , '%' => '%u0025' , '-' => '%u002d' , ';' => '%u003b' , ':' => '%u003a' , '|' => '%u007c' , '&' => '%u0026' , '+' => '%u002b' , '=' => '%u003d' , 'a' => '%u0061' , 'A' => '%u0041' , 'b' => '%u0062' , 'B' => '%u0042' , 'c' => '%u0063' , 'C' => '%u0043' , 'd' => '%u0064' , 'D' => '%u0044' , 'e' => '%u0065' , 'E' => '%u0045' , 'f' => '%u0066' , 'F' => '%u0046' , 'g' => '%u0067' , 'G' => '%u0047' , 'h' => '%u0068' , 'H' => '%u0048' , 'i' => '%u0069' , 'I' => '%u0049' , 'j' => '%u006a' , 'J' => '%u004a' , 'k' => '%u006b' , 'K' => '%u004b' , 'l' => '%u006c' , 'L' => '%u004c' , 'm' => '%u006d' , 'M' => '%u004d' , 'n' => '%u006e' , 'N' => '%u004e' , 'o' => '%u006f' , 'O' => '%u004f' , 'p' => '%u0070' , 'P' => '%u0050' , 'q' => '%u0071' , 'Q' => '%u0051' , 'r' => '%u0072' , 'R' => '%u0052' , 's' => '%u0073' , 'S' => '%u0053' , 't' => '%u0074' , 'T' => '%u0054' , 'u' => '%u0075' , 'U' => '%u0055' , 'v' => '%u0076' , 'V' => '%u0056' , 'w' => '%u0077' , 'W' => '%u0057' , 'x' => '%u0078' , 'X' => '%u0058' , 'y' => '%u0079' , 'Y' => '%u0059' , 'z' => '%u007a' , 'Z' => '%u005a' , '0' => '%u0030' , '1' => '%u0031' , '2' => '%u0032' , '3' => '%u0033' , '4' => '%u0034' , '5' => '%u0035' , '6' => '%u0036' , '7' => '%u0037' , '8' => '%u0038' , '9' => '%u0039' } # Convert string to array of chars chararray = string.scan(/./) newstr = String .new chararray.each do |c| if lookuptable.has_key? c newstr = newstr + lookuptable[c] else newstr = newstr + URI.escape(c) end end return newstr end print "Enter string to URL Unicode:" puts unicode_url(gets) ps: HdhCmsTest2cto测试数据 感觉编码在很多地方很强大,但是没掌握到其精髓,还处于模糊阶段
查看更多关于WAF绕过tips---%u encoding - 网站安全 - 自学php的详细内容...