4
12
2019
0

网络攻防练习-Pikachu平台

最近进了CTF的坑,于是时间再次被压榨……

开个文章记录一下学习过程

之前把JarvisOJ和NUPT_CTF的题刷了一些

这篇文章主要基于Pikachu平台进行Web方向的CTF练习

环境使用Windows10-64bit和Firefox浏览器,平台使用Apache2.4+Mysql8.0+PHP7.3.4

具体的平台在https://github.com/zhuifengshaonianhanlu/pikachu

占坑待填~

---------------------------------------

这文章访问量比我之前几篇都高……我也不知道为什么

那就写一下吧,不然太对不起读者了

下文列出的工具基本上都能在52pojie论坛上找到。

对于本机无法被burpsuite抓包的问题,我自己谷歌始终不抓包,换成火狐浏览器再设置下就好了

传图太麻烦了,这回就纯文字描述一下……求谅解……

---------------------------------------

暴力破解
---------------------------------------
基于表单的暴力破解:
你需要使用Burpsuite,我自己用的是Burpsuite Pro v1.7.30
首先你要下载一个字典合集:https://github.com/danielmiessler/SecLists 基本包含了各种常用的字典。
打开Burpsuite,打开Proxy-Options,运行Proxy Listeners的服务器127.0.0.1:8080
打开火狐,我装的插件有Hackbar、User-Agent Switcher和FoxyProxy Standard。
在Foxy里面配置好本地代理127.0.0.1:8080,打开页面
我们能看到有两个输入框:Username和Password。
接下来我们随便输入几个字符(用户名和密码都是123)进去,用Burpsuite抓包(记得打开Proxy-Intercept里面的开关)
看到抓到的包长这个样子:
POST /pikachu/vul/burteforce/bf_form.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/pikachu/vul/burteforce/bf_form.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

username=123&password=123&submit=Login
注意这里username和password都直接明文显示了,我们点击一下Forward看看反应。
网页显示:username or password is not exists~,然后继续让你输入。
这就比较好办了,我们选择Proxy-HTTP History,找到刚才的POST指令,右键Send to Intruder(主要用来爆破密码)
点开Intruder-Positions,选择攻击方式为Cluster Bomb
大致说下四种攻击方式的区别:
Sniper一般只针对单个位置攻击(将某个位置改变,其他位置不变进行爆破,选择多个位置则都这么操作一次)
Battering ram是将多个位置同时替换成某个一样的值
Pitchfork是将某个表(或者之类的东西)中第一个用在第一个位置,第二个用在第二个位置……以此类推(轮流,对付某些防御方式有效)
Cluster Bomb则是指定多个位置,分别穷举替换。
我们这里采取第四种方法。
选完之后删掉不用的Payload位置(PHPSESSID和sumbit位置的),点击Payload导入刚才说的seclist字典
这里用户名就用最普通的那个,密码选择darkweb10000字典(Payload options我选的是simple list,然后load文件选字典)
点击Start attack开始攻击
攻击完成后按照Length从小到大排序,看看那几个不同的,就有了我们需要的账户和密码。
这里字典没有pikachu这样的用户,也就没法猜出来了……不过对于常见的无验证弱口令都基本上可以这么爆破。
---------------------------------------
验证码绕过(on server):
看题目就知道这次的验证码是在服务端
我们先观察下这个网页。
这次有三个框要填,我们像刚才一样先随便填写一下。
先试试123 123 错误验证码,提示:"验证码输入错误哦!"
再试试123 123 正确验证码,提示:"username or password is not exists~"
一般来说这就是说先检查验证码,再去检测用户名和密码。
查看下网页源代码(F12),发现这个验证码图片是用一个php生成的:showvcode.php
这下不太好办了,似乎是在服务端处理的操作。
那么是不是就不行了呢?
我们再复现一次正确验证码的操作,用Burpsuite抓包。
POST /pikachu/vul/burteforce/bf_server.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/pikachu/vul/burteforce/bf_server.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

username=123&password=123&vcode=lua63g&submit=Login
这里发现vcode也是发过去的。然后Forward几个Request包
似乎状况不妙,但是我们一定要想办法。
我们看下提示,是说“这个验证码始终有效”
那么我们考虑将这个正确的验证码的包反复发,看看行不行。
再输入一次正确验证码,然后卡住Intercept不Forward。
直接把这个包在Intercept界面右键Send to Repeater(反复发包)
我们Go一下,右侧界面拖到最下面往上一点显示"username or password is not exists~"
我们再Go一下,再拖一次,照样这么显示。
那么我们就利用这个包进行暴力破解。
右键Repeater的这个包,Send to Intruder
剩下的流程就和上一个一样了,不再赘述
---------------------------------------
验证码绕过(on client):
看题目就知道这次验证码在本地
我们发现这次还是三个框。
不过这次验证码看上去不像一张图片,我们再试一下查看元素
发现这个是一个createCode的函数实现的。
那么我们搜索源代码,找找这个函数。
我们发现这个函数就在网页中写着,而且判断也在网页中判断,错误就直接alert。
那么我们只需要按下F2把这个函数改成直接return true,然后用第一题的方式暴力发包即可。
---------------------------------------
token防爆破?:
看题目名就知道这次不好做
我们先观察,看到这次就两个框,貌似能直接用第一题的方法爆破。
于是做一番尝试,我们就发现Intruder显示的都一样,没法判断这个用户名密码是否是正确的。
似乎陷入绝境了?我们百度一下
发现返回包中的token值在不停的变化。
我们猜测每次发包中包的token需要和上一次包中返回的token一样。我们要利用这点。
随便输入123 123,Intercept发到Intruder
选择Cluster Bomb,在Options里把thread调整成1(这个方法要求获得的新的来自前一个,没法并发)
在Options选择Grep - Extract(下面英文解释了从返回值中获得有效信息)
Add - Fetch response
选中新的token然后点击Ok
下面的Redirections选择Always,因为我们需要重新定向到更新了token的网页(存疑,我试了Never发现也能正常破解)
我们返回Payloads页面,前两个按照正常的操作(之前题目1的操作)
第三个(token),我们更改Payload Type为Recursive grep(递归抓取)
然后开始Attack,选择Pitchfork模式
然而因为用户名行数很少,所以就爆破失败了。
用cluster bomb,就会出现抓不到payload3的情况,也就是没办法同时爆破用户名和密码。
想了好一会儿又百度了一阵子,没啥好的解决方法,只能先固定用户名然后爆破密码了。这也太不智能了。
还有一种方法就是复制字典很多遍,这个可以写程序做到,不过太智障了
还有一个办法就是写脚本爆破,不过我python url方面不熟,先不管了
还有一件事,就是每次都要先发个request 0 过去,这样会导致第一次密码必定无法提交(token不正确);我也没办法解决这个问题,只好把第一个密码在加在最后,这样可以保证每个密码都尝试。
本题结束
---------------------------------------
Cross-Site Scripting(XSS)
---------------------------------------
反射型xss(get):
看提示发现直接输入kobe,如果啥都不输入直接sumbit也会告诉你输入kobe
我们观察一下,有一个文本框,有个按钮要我们提交。
先随便输个123然后抓包
GET /pikachu/vul/xss/xss_reflected_get.php?message=123&submit=submit HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/pikachu/vul/xss/xss_reflected_get.php
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

发现我们输入的123传到了php的网址上面,而不是内容发包。

然后我们观察结果,会有“who is 123,i don't care!”的字样。也就是说,这个网页会输出你输入的东西。

那么,我们随便改一下输入的东西,比如<script>alert(1);</script>

然后,我们就发现这个框限制了输入的长度。

没关系,我们直接在地址栏进行输入,于是跳出了一个框为数字1

那么,这个框对输入就没有过滤,可以进行攻击了。

本题结束(反正没有要测试的点)

---------------------------------------
反射性xss(post):
观察一下,有两个框,一个提交按钮。
我们先随便输入123 123抓包
POST /pikachu/vul/xss/xsspost/post_login.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/pikachu/vul/xss/xsspost/post_login.php
Content-Type: application/x-www-form-urlencoded
Content-Length: 38
DNT: 1
Connection: close
Cookie: PHPSESSID=qcoa6i4788q6cafbso3uh40oan
Upgrade-Insecure-Requests: 1

username=123&password=123&submit=Login

看上去像个爆破?这样不太好233

我们还是练习一下XSS。

先用给的密码登录上去,发现了上一题的窗口。

我们的目标是不登录但是伪装成管理员,所以构造一个payload为<script>alert(document.cookie)</script>

然后提交一下,我们就拿到了管理员的cookie。

观察一下,发现[pw]字样后面跟的像个md5,拿到www.cmd5.com查询一下,得到密码123456。

不这样的话,直接用这个cookie来伪造登录也是可行的。因为一般像密码这种都进行了加密,md5其实是不常用的。

也就是说,如果我们能在管理员登录时设法拿到cookie,就能伪装身份了。(比如把cookie发送到自己的网站)

具体修改方式:你先拿到cookie,然后在要伪装的界面按F12,选择菜单中的Hackbar,下面有一行cookie,选中后填写cookie就可以了。

本题测试方式:拿到cookie之后,在不登录情况下访问xss_reflected_post.php会跳转到post_login,但是用Hackbar改完cookie之后就可以直接访问xss_reflected_post.php了,能正确显示。缺点是sumbit之后会跳转回去(不持久),还是专门下个保存cookie的插件比较好,我推荐Cookie Editor,除了那个js代码转换麻烦点,这样就可以一直用admin的身份登录了。

---------------------------------------
存储型xss:
给了个留言板。
于是,我们构造<script>alert(document.cookie)</script>
直接得到了cookie。。。
具体用法:你留好这次言后,每次重新访问这个页面都会跳框显示cookie。
于是,攻击者可以把跳框改成发送这个cookie到自己的服务器上,从而伪装成访问过这个留言板的所有用户来访问这个网站。
本题结束
---------------------------------------
DOM型xss:
像往常一样构造<script>alert(document.cookie)</script>,然后会跳出来一个"what do you see?",点进去发现是直接在前一层菜单加上输入的文字。
打开提示,叫我们看看DOM是啥
结果网址点不开……上网查下,咋感觉就是普通的网址访问
于是右键查看元素,看到跳转函数是domxss()
Ctrl+F查找下,发现提示直接用注释写在里面了= =
我没用给的构造,自己写了个payload '> <img src=0 onerror=alert("123")>
本题结束
---------------------------------------
DOM型xss-x:
这题给人一种和上一题一样的感觉
随便输点东西,就跳出了一个类似的跳转
我们右键审查元素,看到一行代码onclick=domxss()
于是,我们Ctrl+F查找domxss()
发现了熟悉的代码
跟上一题一样构造即可,用法是点击那个超链接,相对于直接弹窗要好一些。
这种提交方式可以一定程度防止XSS攻击……
本题结束
---------------------------------------
xss之盲打:
随便构造<script>alert("123")</script>,用提示的后台登录显示弹窗
本题结束
---------------------------------------
xss之过滤:
随便输个123
显示 别说这些'123'的话,不要怕,就是干!
观察一下源代码,发现是form method=get,是用get方式传输参数
输入<script>alert("123")</script> 发现无法正常显示
发现过滤了关键字,试一下<ScRipT>alert("123")</ScriPt>
被Google Chrome拦截了。。。(好吧我习惯用Chrome做题)
改成火狐,成功弹框
本题结束(这个过滤不行……之前打比赛被关键字过滤到怀疑人生)
---------------------------------------
xss之htmlspecialchars:
按照提示,先百度一下
感觉没啥特别的,就是字符串转成HTML实体,好像没啥大区别
构造<script>alert("123")</script>,发现会有一个超链接,根据题目意思估计这个是a href的一个字符串用htmlspecialchars转换来的
那么重新构造'><script>alert("123")</script>,发现不行,打开源码看下发现出现了&gt;这样的字符
百度一下发现这个是字符实体,应该是过滤了尖括号,那就改用圆括号吧
构造'onclick='alert("123")' 点击后成功弹窗
然后发现'onmousemove='alert(123)'效果更好,鼠标移上去就弹,在现实中更容易攻击成功
其实还有一个onload,理论上效果最好,但是上网查一下发现这个事件只能放在body iframe之类的框架中,一般用不了
本题结束
---------------------------------------
xss之href输出:
先随便数一下,发现是挂靠在网址后面的,用了一些构造没啥效果,估计是全部被转换为实体了
看下提示,感觉还不明白,只好上百度看下,然后搜到了某网站的收费课程(这也能收费。。。反正我很无语)
没办法,再搜索一番,找到了一个构造:Javascript:alert(123)
原理是利用a href能直接启动js,而且这次过滤没有过滤括号和引号
本题结束
---------------------------------------
xss之js输出:
随便输入123,点击
输出 无论如何不要放弃心中所爱.. 感觉很迷
查看源代码,发现了一段script
<script>
    $ms='123';
    if($ms.length != 0){
        if($ms == 'tmac'){
            $('#fromjs').text('tmac确实厉害,看那小眼神..')
        }else {
//            alert($ms);
            $('#fromjs').text('无论如何不要放弃心中所爱..')
        }

    }


</script>

思考一下,模仿这个语法,构造 ';alert(123);' 弹框成功

本题结束

---------------------------------------
Cross-site request forgery(CSRF)
---------------------------------------
未完待续~
Category: CTF | Tags: CTF | Read Count: 58

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com