一个训练web的小网站:https://overthewire.org/wargames/natas/
类似于ctf题,不同的是拿到的不是flag而是下一道题的密码
第一关给出了默认密码,进入后查看源码获得natas1密码:g9D9cREhslqBKtcA2uocGHPfMZVzeFK6
将url中的0改成1,使用natas1用户名和刚才的密码进入到natas1关卡中
禁用右键,没什么用,而且这里禁用只有在白色的这一小部分有效,剩下的灰色部分都仍旧可以右键
拿到密码:h4ubbcXrWqsTo7GGnnUMLppXbOogfBZ7
第三关
这回不再直接放在源码中了,而是多了个png图片,打开发现什么都没有,访问files目录试试
在users.txt中拿到密码:G6ctbMJ5Nb4cbFwhpMPSvxGHhQ7I6W8Q
natas和关数对不上,容易搞混,从这开始统一用natasX了
natas3:
什么意思?让我们用谷歌语法?
查了半天没查到,一看别的大佬写的攻略,人家的意思是google真的查不到,让我们去找robots.txt,我还以为是提醒我们查google
拿到密码:tKOcJIbzM4lTs8hbCmzn5Zr4434fGZQm
natas4:
要伪造访问地址,拿XFF试了半天,想起来这是ip的,这里的是要伪造从哪个页面访问到这个页面,用到的是http头中的referer
有可能会出现页面空白的情况,可能是大家共用的原因,多试几次就好了
忘了说没说过这个插件,这是火狐的hackbar,能够代替bp的小部分功能,方便节省些时间
一定要是这个,另一个最顶上没有这个v2的hackbar是要收费的
安装这个插件后f12最右边就是,左边是加载,分割和执行,中间可以添加post,referer等数据
拿到密码:Z0NsrtIkJoKALBCLi5eqFfcRN82Au2oD
natas5:
怎么跟上一关一模一样?
试了半天发现好像还是卡的原因,没进到natas5里边
在natas5里输完用户名和密码之后告诉我们没有登陆,这次直接抓包直观看看
发现cookie中有个loggedin=0,改成1发到repeater里
拿到natas6:fOIvE0MDtPTgRhqmmvvAOt2EfXR6uQgR
natas6:
从这开始需要分析一下代码了,这里的php部分首先include了一个secret.inc,直接构造路径访问并查看源代码能够得到secret变量的值
然后会比较POST传递的参数和$secret的值,如果相同,则给出密码,如果不同给出Wrong secret
复制secret的值查询
得到密码:jmxSiH3SP6Sonf8dv66ng8v1cIEdjXWr
natas7:
给了两个页面
没什么东西,看看源代码
两个页面只有显示的文字不同,hint中提示了password的路径,url中又有参数,有可能是要用到伪协议
成功用file读取到密码:a6bZCNYwdKqN5cGP11ZdtPg0iImQQhAB
natas8:
似乎依旧是代码审计
访问index-source看源码
分析源码,首先定义了一个encodeSecret变量,然后写了一个加密的函数,最后比较加密过的POST数据和encodeSecret变量
那我们需要做的就是逆向它的加密过程,这里要用php反着写一遍,为了方便直接用gpt帮我们写
一直忘记整一个php的编辑器,这里直接拿蚁剑插件来跑
回去输入到查询中,得到
密码:Sda6t0vkOPkM8YeOZkAGVhFoaplvlJFd
natas9:
继续审计代码
大概就是先判断有无needle这么个参数,如果有就执行这段“grep -i $key dictionary.txt”
看起来是个命令执行,直接用管道符过滤掉前面的输出,输出我们要执行的命令:1 | ls /
成功执行
找了半天没找到密码在哪,忽然想起来之前伪协议的时候提示过一次密码在/etc/natas_webpass/......
这里除了natas9和natas10,其他的都是读不了的
读取natas10拿到密码:D44EcsFkLxPIkAAKLosx8z3hxX1Z4MCE
natas10:
跟上一关一样的界面,这次估计是过滤了
能够看到过滤了很多东西
这里基本就用不了我们的命令了,可能有比较复杂的绕过但是这里不讨论,能够看到给出的是grep命令,那我们可以用grep本身来读取密码,要注意的是grep的通配符并不是*
尝试了. /etc/.......,发现能读取9和10的,读不了11,可能是又卡出了什么bug,刷新一下清清cookie试试
好使了:1KFqoJXi6hRaPluAmk8ESDW4fSysRoIg
natas11:
异或?坏了,这我到现在还没学呢,赶紧学学
嗯……看了能有一个小时左右?没找到字母和字母怎么异或的,寻思先把题做了,结果最后那个base64解不开,一查才发现那个%3D是url编码后的=号,不能直接粘贴,mad气死我了
好了现在我们来看看代码:
从第一句和最后一句来看跟php反序列化挺像的,要将showpassword更新成yes来获取密码
然后分析一下这几个函数,首先是xor_encrypt
这里是一个异或运算的过程,但是key没有给出
接下来是最主要的这个
这里把cookie中的data拿出来,先base64解码,然后异或运算,然后json解码,剩下的是一点赋值操作,而我们能够拿到cookie中的data数据,也就是能反推出key的值
脚本见这位大佬文章:https://blog.csdn.net/weixin_47610939/article/details/122609404
拿到key之后再更改下脚本,将showpassword改成yes加密,然后放到cookie中
natas12:YWqo0pjpcXzSIl5NMAVxg12QxeC1w9QG
natas13:
一眼顶针,鉴定为文件上传,先康康源代码
给了全部代码,有点长 又一堆函数,直接审计不如先传一下试试
传了个shell.php,上去的是随机生成的文件名加.jpg,再回头看代码
看起来三个函数都带有随机,仔细一看三个函数依次调用了前一个函数,感觉有点离谱,为啥不写到一个里呢
先看第一个函数,主要在循环中这一句:$string .= $characters[mt_rand(0, strlen($characters)-1)];
.=在php中用来将右边的值附加到左边的变量上,mt_rand函数用来生成随机整数,这里是生成了从0到characters字符库长度-1中的随机数字,来随机选择characters中的字符,然后附加给 string
第二个函数没什么东西,将生成出来的随机字符串作为文件名放到了$dir/和.$ext中间
第三段传入了个$fn,经过处理变成了$ext,这个pathinfo函数没太看懂是干嘛的,似乎是提取文件后缀,但是瞅了半天没看见哪给我改成jpg的,然后发现下边的html中有一小段调用了genRandomSting()并加上.jpg输出的,这个值赋值给了filename,然后传到了主函数 中,接着通过上边的一堆处理把文件名改成了这个
想了半天没想出来这怎么绕过,一看攻略反应过来了,这里的value是在 html中更改的,通过post传进去的是filename,直接抓包改掉filename就行了
抓包可以看到生成的随机文件名,这里直接改为shell.php
文件名似乎依旧是随机生成的,但是我们只需要后缀就行了
这里不知道为什么写进去之后蚁剑连不上,哥斯拉也是,只好手动往里敲
依旧是老地方,/etc/natas_webpass/natas13
natas13:lW3jYRI02ZKDBb8VtQBU1f6eDRo6WEj9
natas13
跟上一关一样,又是让人头大的代码审计
看了半天,大概只有这一个地方有问题:
跟上一关一样尝试直接修改时,会给我们这样的提示:
百度的值exif_imagetype用来检查文件是否为图片,检查的是头两个字节
这里我直接用了以前做sqlilabs时候做的图片马,结果发现有大小限制,然后又改小,结果还是有这行返回的报错,我以为是哪不对,结果发了好几遍之后发现下边还有个提示
没太看懂这代码的逻辑,总之访问是可以用了
但是蚁剑还是用不了,也不知道为什么
只能接着手搓
嗯……感觉马改进的不太合理,应该把phpinfo放在eval后边,要不就得拉到最下面看回显
natas14:qPazSJBmrmU7UQJv17MHk1PGC4DxZMEP
natas14
随便打打单双引号,看来是来到了注入环节,来看看源代码
这几个反斜杠给我看得稍微有点迷,试了试admin" or 1=1不好使,但是" or 1=1好使,密码要写双引号
在尝试注入的时候经常会报这个:
没太搞懂这是怎么回事
拿到的natas15:TTkaI7AWG4iDERztBcEyKV7kRXH1EZRB
natas15
依旧是单双引号,出现报错:
正常的:
看起来有点像布尔?
瞅瞅代码吧
呃……好像确实是布尔
试了下sqlmap,结果发现由于有个登陆验证,sqlmap跑不了,可能得自己写脚本自动登录之类的
手注太麻烦了而且我在尝试的时候不知道为什么一直是doesn't exist的回显,等我再研究研究再说