1 介绍
最近准备复习一下常见web漏洞,打算从pikachu开始吧,比较简单不涉及绕过
2 靶场WP
1 暴力破解
第一关
没有任何验证码相关的内容,可以直接跑字典
burp抓包给intruder模块
设定好爆破的位置,之后选择cluster bomb,该爆破方式为逐个行匹配测试,相当于两个for循环,遍历所有组合
payloads中选择使用的字典
点击start attack开始爆破
根据包长度判定是否为正确账号密码,可以看到长度为34984的包为正确账号密码(723包为请求过速,因此没有出test-abc123的账号)
第二关
第二关加了服务端出验证码
首先看是否能直接删掉该字段
发包后提示不能为空,因此后端对验证码进行了校验
判断是否存在验证码未失效的情况,burp按照之前的设置,验证码为当前抓包时的验证码,成功爆破
第三关
前端生成并验证,后端不验,首先前端输入一个正确的验证码,抓包发送给intruder后删除,之后爆破,成功
第四关
加了token,但没有用,因为可以直接拿到token,burp中提供正则匹配功能
注意此时不能再用cluster bomb了,需要修改一下user和password字典,用pitchfork,线程不要开大,中间最好sleep一下,否则token可能会乱
在options中设置好匹配的字段,比较方便,直接选中,不用自己写正则
可以看到爆破出了一个(字典关系)
至此,爆破部分结束
2 XSS
第一关和第二关
反射型xss,没有过滤,直接script标签弹窗,注意有长度限制,直接改js即可
post首先登录,这边找一个在线xss打一下cookie(都需要注册,再见),直接dom拿cookie写回页面吧,script标签console.log输出
第三关
存储型xss,会将payload写到页面上,只要访问就会触发
所以这里不用弹窗,否则需要到库子里删,不然每次访问都会触发弹窗
console.log输出一些东西吧
留言未显示已经被作为标签解析了,成功执行
第四关
dom型,输入会被写入到href中
用href的弹窗,javascript:alert(1)
点击弹窗
第五关
xss盲打,存在一个登录页面,猜测是打管理员后台
这里还是console.log输出cookie
不确定xss出在哪,因此用户名和留言都写
有一条没有显示,看控制台
成功输出cookie
第六关
有过滤,<script标签被替换空,尝试双写仍旧替换
使用其他标签,此处用img和onerror
第七关和第八关
输入写入到a.href中,和dom那个一样,实体化编码未编冒号和括号
直接用之前的payload
第九关
有一段js代码,可以看到输入直接放到$ms
尝试闭合,然后自己写script,标签现在是这样
略微修改弹个窗
XSS篇完结
3 CSRF
第一关
get型,传参等get方式实现,查看表单也可发现
原始信息如下
伪造一个请求,以lucy身份点击
http://x.com/vul/csrf/csrfget/csrf_get_edit.php?sex=1&phonenum=2123123&add=hello&email=123@123.com&submit=submit
第二关
post方式同理,但是需要自己写post发包,这种需要点击,最好hidden一下前面的表单内容
<form method=post action='http://x.com/vul/csrf/csrfpost/csrf_post_edit.php'>
<input name='sex' value='1'>
<input name='phonenum' value='2'>
<input name='add' value='3'>
<input name='email' value='4'>
<input type='submit' name='submit' value='submit'>
</form>
提交完之后
第三关
带csrf token,看是不是验证
请求带token且验证,可防
至此,CSRF完结
4 SQL注入
啊,来到了sql注入这个大洞
第一关
第一关字符型post,post数据为1 and 1=1时正常,1 and 1=2时报错无user id
这里直接出数据库名,不做后续测试
发包到repeater中,修改数据测试,order by测有2列
union select测两列均回显
出数据库,union select 1,database()
第二关
get+字符型,单引号报错信息推断语句靠单引号闭合
增加注释hello'--+,不报错
其他流程同post型,出db
第三关
搜索型注入,没有听说过,按照get+字符型测,报错信息如下
查了一下资料,语句大概为like '%输入%',本质上还是和字符型没有什么区别,只是注入时候用的语句多了%闭合
payload用%' order by 4--+,报错信息如下,正确闭合
有些可能可以用and '%'='来闭合后半部分,但是这里没有用,不会报错,所以直接注释了
其他流程和上面一致
第四关
xx型注入?直接单引号看报错信息,拆分一下,'1''),应该是('输入')
使用1')--+测试闭合,正确
其他流程同之前
第五关
insert、update,看标题好像是打堆叠?测试发现登录框好像没有注入点
猜测是不是注册时用了insert和update语句存在注入
repeater测试
每个位置都有注入点,但是似乎不太一样,有的是xx型里的
此处用')--+根据报错信息判断闭合为insert语句的闭合,即('','','',...)
最后一个位置注入,尝试') order by 1 and ('1'='1,失败
尝试不闭合括号,最终报错注入成功,payload为1' and extractvalue(1, concat('#', (select database()))) and '1'='1
第六关
和insert/update关卡一样,只是此处的sql注入点在delete语句上,删除评论时触发
在url中的id上加',报错如下
最终确认为数字型,order by尝试,1时就报错,改用报错注入,+and+extractvalue(1,concat('~',(select+database())))
第七关
可以看到记录了ip地址等信息,尝试http头注入
这里使用ua头,修改ua为1',报错,确认注入点
仍旧采用报错注入的方式,使用#似乎没办法注释掉内容,参考insert注入,尝试闭合,成功
第八关
盲注,这里用之前搜索型的用户名,lili,正确回显
使用lili',报用户不存在,基于此,确定为布尔型注入
尝试确认数据库长度(从上面可以知道数据库为pikachu,这里为方便直接按照pikachu写),lili' and length(database())>num#,确认长度为7
接着爆库名,这里只尝试第一位,payload为lili' and substr(database(),1,1)='p'#,正常回显
剩下的可以写脚本跑了,或者burp也可
第九关
基于时间的盲注,这里试了一下不能带外,默认应该没开secure_file_priv,想测的可以手动开一下
和布尔盲一样,语句换成lili' and sleep(2)#,抓包看,发现延时,存在注入点
配合if语句打盲注即可,因为耗时较长,就不演示了
第十关
宽字节,原理大概为加%df或%bf之后和\闭合成为一个gbk的编码,绕过对单引号的转义
这里在burp中测,输入框提交时%df解析有问题
lili%df'+or+1=1+--+可以爆出所有内容,存在注入
联合查询出数据库
注意我这里order by没有结果,根据之前的判断列为2或3,最终2成功,找了一下别人的,order by 3会在中间这个位置报错
好滴,sql注入篇完结
RCE
rce篇比较简单,可以看我之前写的命令执行的文章,这个直接秒了
第一关
猜测命令为ping 输入
分号分开,1.1.1.1;ls;,成功执行
第二关
system('ls'); 同样直接秒
RCE篇完结(貌似没有什么知识点)
文件包含
第一关
一个本地文件包含,随便选一个,看一下url
filename传递了一个参数,对其进行测试
用file协议尝试读/etc/passwd,用../往上翻
所以包含一下同级目录下的rce吧,payload为../../rce/rce.php,注意看url
第二关
远程包含,需要开allow_url_include
因为用的buuctf环境,所以暂时没法测
可以尝试提权改(bushi)
不安全文件下载
看前端代码,发现链接到一个位置
尝试改filename,这里还是../../rce/rce.php哈,点击下载
就造成了文件泄露
文件上传
第一关
客户端校验,即js脚本检测后缀,大概就是检测后缀是否为png或jpg或gif,不是则弹窗
写一个phpinfo的页面
先改后缀为jpg,burp抓包再改回来
访问一下
第二关
MIME检测,即检测文件类型
抓个包,改content-type
第三关
getimagesize检测,记得好像是检测文件头,做一张图片马
上传发现对文件名还有限制
之前phpinfo看apache版本
%0a截断试一下,不行
只能文件包含了(悲),在一大片奇形怪状的符号里找出phpinfo
文件上传篇,完结!
越权
第一关
水平越权,就是说我们可以看到同级下的其他用户信息
观察url发现参数username为我们的用户名,对应我们lucy的信息
改成lili的试试,成功查看
第二关
垂直越权,就是说我们能够从普通用户拿到管理员的权限
登录pikachu账号,页面没有什么特别的
登一下admin,发现一个新增用户页面
尝试以普通用户身份访问该页面,成功
添加一个用户试试
越权篇,完结~
目录遍历
这里有两个链接,先看一下,发现url的title参数传指定的文件,尝试和文件包含一样../,访问到了rce页面
敏感信息泄露
开前端页面,看到用户名密码
登录成功
php反序列化
详细内容可以看我之前写的php反序列化篇
这里需要看一下源码中的类
确定类之后,因为直接echo出来了,那我们可以xss
O:1:"S":1:{s:4:"test";s:n:script弹窗payload;}
XXE
XXE可以先了解一下xml文档结构
文档=头+DTD+正文
其中DTD如果可以加载外部实体,可能导致问题
比较常见的是file_get_content(php://input)直接读post信息,然后simple_load_xml解析
为了方便,这里还是打文件读取,也可以尝试打内网或者rce,payload如下(freebuf这个md编辑器预览和最终发布不太一样,可能显示有些问题)
<?xml version="1.0" ?>
<!DOCTYPE note [
<!ENTITY hack SYSTEM "file:///etc/passwd">
]>
提交后成功访问
这里顺便试一下之前学的盲xxe,打一个复杂点的,因为环境限制,靠文件上传走一个dtd,配合dnslog读文件吧
文件上传内容
加载外部dtd的payload为
但是没有收到dns请求
看了一下源码,没开DTDLOAD
不安全url跳转
审计代码,发现文字对应的链接如下
可以看到最后两个和之前的不一样,一点击就跳转到别的页面或者发送了一个请求
这个故事告诉我们,不要随便点陌生链接
SSRF
第一关
curl出的ssrf,可以利用的点比较多,比如打内网或者读文件
这里由于环境限制打读文件,自己搭建的话可以尝试打redis
点击链接发现url参数指向内网(这里会not found,因为buuctf的靶机在81)
尝试修改该参数,file协议读/etc/passwd,成功
试了一下gopher打rce页面的命令执行,没有成功(感觉是路径的问题或者包的问题)
第二关
file_get_content出的ssrf,这里参数变成了file,一样的打法
修改file为file:///etc/passwd,成功
总结
结su啦,算是复习了一遍,之前xxe只是停留在理论上,还没有打过实战,这里练了一下,感觉加深了一下理解
道行比较浅,如果有错误请大佬指出来,蟹蟹~
后面打算刷一刷java靶场,练习一下java的审计,可以期待一下哦
后续也会出内网的打靶,但是电脑内存不太确定支不支持
体会就是,还是需要多练,多动手
请登录/注册后在FreeBuf发布内容哦