pikachu靶场通关WP

pikachu靶场通关WP

      • 暴力破解
        • 基于表单的暴力破解
        • 验证码绕过(on server)
        • 验证码绕过(on client)
        • token防爆破?
      • Cross-Stie Scripting
        • 反射型xss(get)
        • 反射型xss(post)
        • 存储型xss
        • Dom型xss
        • Dom型xss-x
        • XSS盲打
        • XSS过滤
      • XSS之htmlspecialchars
        • XSS之href
        • XSS之JS输出
      • CSRF
        • CSRF(get)
        • CSRF(POST)
      • CSRF 防范
        • 增加token验证
        • 关于安全的会话管理(避免会话被利用)
        • 访问控制安全管理
        • 增加验证码
      • SQL注入
        • 数字型输入
        • 字符型注入(GET)
        • 搜索型注入
        • XX类注入
        • INSERT/UPDATE注入
        • Delete注入
        • "http header"注入
        • 盲注(base on boolean)
        • 盲注(base on time)
        • 宽字节注入
      • RCE
        • exec"ping"
        • exec"eval"
      • File Inclusion
        • 本地文件包含
        • 远程文件包含
      • Unsafe Filedownload
      • Unsafe Fileupload
        • client check
        • MIME TYPE
        • get_imagesize()验证
      • over permission
        • 水平越权
        • 垂直越权
      • ../../../
      • 敏感信息泄漏
      • PHP反序列化
      • XXE
      • 不安全的url跳转
      • SSRF
        • curl
        • file_get_content

Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。 如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你意。

此篇是学完韩露老师在i-春秋上的课程《Web安全从入门到“放弃”》做的笔记,视频教程较长,时长458分钟,特此记录文字版学习心得和靶场通关全过程以备日后查看。
靶场环境搭建此篇不做赘述,可以直接使用现成docker镜像,但部分功能由于环境问题不太正常,通过进docker镜像的shell改配置文件即可。

暴力破解

burp爆破参考链接:https://t0data.gitbooks.io/burpsuite/content/chapter8.html

基于表单的暴力破解

开启Burp抓包, Cluster bumb 对username,password字段的字典做全排列爆破,得到admin/123456,没啥好说的。

验证码绕过(on server)

验证码不过期,用repeater模块测试验证码是否过期,发现验证码不过期可以重复提交username 和password,同上爆破
思考burp怎么从服务端 拿回验证码填到payload

验证码绕过(on client)

客户端自己验证自己,就是一切都用户说了算。f12开发者模式查看网页源码发现验证码的生成和验证码的校验都是通过前段实现的

<script language="javascript" type="text/javascript">
    var code; //在全局 定义验证码
    function createCode() {
        code = "";
        var codeLength = 5;//验证码的长度
        var checkCode = document.getElementById("checkCode");
        var selectChar = new Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//所有候选组成验证码的字符,当然也可以用中文的

        for (var i = 0; i < codeLength; i++) {
            var charIndex = Math.floor(Math.random() * 36);
            code += selectChar[charIndex];
        }
        //alert(code);
        if (checkCode) {
            checkCode.className = "code";
            checkCode.value = code;
        }
    }

    function validate() {
        var inputCode = document.querySelector('#bf_client .vcode').value;
        if (inputCode.length <= 0) {
            alert("请输入验证码!");
            return false;
        } else if (inputCode != code) {
            alert("验证码输入错误!");
            createCode();//刷新验证码
            return false;
        }
        else {
            return true;
        }
    }


    createCode();
</script>

只要正确填写过一次验证码(注意它这里的验证码是区分大小写),让burp抓到包就可以爆破了

token防爆破?

查看源码发现提交的表单里面有个hidden属性的token值,每次拉取表单的时候生成的token值会不一样,提交的表单必须含有该token值才有效,burp的intruder模块中递归grep (Recursive grep)正合适这种模式。此Payload类型主要使用于从服务器端提取有效数据的场景,需要先从服务器的响应中提取数据作为Payload,然后替换Payload的位置,进行攻击。它的数据来源了原始的响应消息,基于原始响应,在Payload的可选项设置(Options)中配置Grep规则,然后根据grep去提取数据才能发生攻击。
提取token值用于爆破的步骤为:
在token防爆破页面提交一次表单------->Burp抓包------>ctrl+i将报文发送到intrude模块----->position里面设置username,password,token的值为payload------>payload子选项里面payload set 设置1为用户名字典,2为密码字典,3的payload type选择recursive grep--------->payload3的payload option 的initial payload for first payload填上第一次爆破的token值------------> 在option模块的子选项grep-extract中定位到第一次请求返回的form表单里面的toke的value值----------> recursive grep是不支持的多线程的,所以还要在request engine里面设置线程数为1------> 点start attack 按钮开始攻击
这里最简便的算法是让payload1和2做全排列的爆破,但payload3取一次用一次,我没找到设置payload取一次用一次的按钮,所以就直接用cluster bomb模式爆破了,这样爆破其实是3个payload全排列的爆破模式,效率比较低,但其实最终结果也是可以爆破出来的。

Cross-Stie Scripting

反射型xss(get)

输入框提示输入你最喜欢的篮球明星,点击submit之后这里直接将你输入的东西反馈输出到Web前端。测试的时候发现输入框其实对我们的输入长度是有限制的,限制了最大长度是20。

<input class="xssr_in" maxlength="20" name="message" type="text">

比如我们的payload是,长度就超过了限制,绕过方法就是直接在get请求里面的打payload, 如:http://xxx/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert(1)%3C%2Fscript%3E&submit=submit。 或者修改前端input 的maxlength字段直接在输入框写payload提交。
考虑xss实际的攻击场景,这里应该是构造含有payload的的网页链接,诱使用户点击。攻击验证链接如下:http://xxx/vul/xss/xss_reflected_get.php?message=%3Cscript%3Ealert(1)%3C%2Fscript%3E&submit=submit

反射型xss(post)

这里需要登录,前面爆破的账号密码admin/123456登录即可,然后又是输入你最喜欢的篮球明星的输入框,t不同的是post方式提交参数,需要我们构造一个攻击的利用场景。
假设正常提供网站服务的服务器为NS(normal server),攻击者搭建的含有恶意表单页面的恶意服务器为AS(attack server), A想要让B触发NS上的post型xss,那么A需要让B在不知情的情况下Post提交payload到ns上。以窃取b登录ns后的cookie为例,攻击步骤为:A构造一个自动提交payload的到NS的表单页面,放在AS上等待B访问;B浏览器上登录NS后,恰好又访问了AS上恶意提交的表单的页面,则B在不知情的情况下触发了XSS,cookie被窃取。

A AS NS B 构造恶意post的到ns的表单页面 B登录了NS B无意间访问了AS上的恶意页面 AS返回了含有自动post数据到NS的JS代码 B的浏览器在用户不知道的情况下将数据post出去,触发xss A AS NS B post反射型xss漏洞利用场景示意图

存储型xss

存储型xss一般出现在留言、博客日志、评论等地方,危害比反射型xss要大 , 恶意的JS代码保存在服务器端,只要访问该页面的用户都会触发恶意代码,比较著名的SamyWorm就是存储型XSS。利用场景我们来模拟一下cookie窃取:

模拟攻击服务器我们使用nclisten,访问http://www.nclisten.cn/获取一个监听端口模拟攻击者的恶意server, 这里我获取到一个端口52119。意味着提交到http://www.nclisten.cn:52119的流量都是被攻击者掌握的。

此题是个留言板,没有过滤,可以通过提交一个";}

这里的功能是输入一个序列化数据,源码审计此页面是根据序列化的数据创建S对象时执行了echo,返回对象里test变量的值。如构造正常的值如

O:1:"S":1:{s:4:"test";s:7:"pikachu";}

提交后会返回pikachu,但如果提交构造的payload如

O:1:"S":1:{s:4:"test";s:29:"";}

则S执行destruct方法时就会echo js脚本,在前端实现xss的效果了。

序列化漏洞很难通过黑盒测试发现,一般发掘反序列化漏洞主要还是通过源码审计。

XXE

XXE 又称xml外部实体注入攻击。XML 被设计用来传输和存储数据。主要包含三个部分,具体xml是啥可以参考xml教程














<note>
  <to>Toveto>
  <from>Janifrom>
  <heading>Reminderheading>
  <body>Don't forget me this weekend!body>
note>

结合靶场中的源码审计,这里的意思是读取到xml文档数据就在

标签里输出,读取不到xml或者读的xml格式错误就返回"XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?"。

引用外部实体构造读取/etc/passwd的payload的



]>
<x>&f;x>

php里simplexml_load_string()是将xml文档转换成SimpleXMLElement对象,php里解析xml用的是libxml,而libxml在2.9.0版本之后是默认禁止解析xml外部实体内容的,所以后面的版本默认不会有xxe漏洞的。

不安全的url跳转

不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。
如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。

url跳转比较直接的危害是:钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站

这里像秋天的风一样的少年的超链接链接到url

http://xxx/vul/urlredirect/urlredirect.php?url=unsafere.php

点击这个链接之后会跳转到unsafere.php页面

但如果修改url参数,构造url

http://xxx/vul/urlredirect/urlredirect.php?url=http://www.baidu.com

访问上面的链接会跳转到百度。一般用户看域名先看前面,用户可能以为自己访问的是xxx网站,但此处的任意url跳转已经把用户重定向到其他钓鱼页面了。

SSRF

服务端请求伪造,一般出现在服务端A有从服务端B获取数据功能,但服务端A对请求目标没有限制情况。这样攻击者就可以利用服务器A访问服务器B或者其他和A处在同一个内网的机器。通常这个漏洞被用来做内网信息搜集。

PHP中下面函数的使用不当会导致SSRF:
file_get_contents()
fsockopen()
curl_exec()           

curl

从源码可以看到这里的这部分功能是通过curl_exec()函数执行url传过来参数给的地址,然后将参数返回前端。如果url参数被替换成http://xxxx或者curl支持的其他协议等都会被curl执行(curl支持telnet ftp ftps dict file ldap等)

http://xxx/vul/ssrf/ssrf_curl.php?url=http://www.baidu.com

file_get_content

file_get_content()函数是用于将文件的内容读入到一个字符串中的首选方法,逻辑和前面一样。它支持读取远程文件或者本地文件,也支持多种协议。更多的,它还支持php伪协议,我们可以利用伪协议方法读取本地源码

http://www.fucguigui.com:252/vul/ssrf/ssrf_fgc.php?file=php://filter/read=convert.base64-encode/resource=ssrf.php

你可能感兴趣的:(漏洞靶场)