前言
Natas系列包含服务器端Web安全的基础知识。
每个级别的 natas 都由位于 http://natasX.natas.labs.overthewire.org 处的自己的网站组成,其中 X 是级别 数。没有 SSH 登录。要访问某个级别,请输入用户名 对于该级别(例如,NATAS0 表示级别 0)及其密码。
每个级别都可以访问下一级的密码。你的任务是以某种方式获取下一个密码并升级。所有密码也是 存储在 /etc/natas_webpass/ 中。例如,存储 natas5 的密码 在文件 /etc/natas_webpass/natas5 中,只有 natas4 和 纳塔斯5。
难度:适合初学者或需要复习web安全知识的师傅
00 natas0
直接查看源代码
01 natas1
不能右键直接查看源代码,可以使用F12或者curl+u
02 natas2
查看源代码,发现存在files文件夹
试试访问,发现存在目录遍历漏洞
点击users.txt,果不其然出现了密码
03 natas3
点击源代码
"Not even Googel will find it "让我想到了robots.txt文件(该文件限定了一些不允许搜索引擎查找到的文件或者文件夹)
接下来就是访问文件夹,文件和上一关一样
04 natas4
第一次访问网站
点击刷新refresh page,出现了我们的页面url,说明“”内接收了refer头,使用bp构造
构造成功
05 natas5
提示没有登陆,可能是请求头部有问题,上bp
loggedin改为1
06 natas6
array_key_exists 函数
功能:检查指定的键名是否存在于指定的数组中。
它的语法如下:bool array_key_exists ( mixed $key , array $array )。其中,$key 是要检查的键名,$array 是要检查的数组。如果给定的 $key 在 $array 中存在,则该函数返回 true,否则返回 false。
发现需要输入正确的secret才能给出密码,一开始以为是php弱比较绕过,发现构造不了
后面发现该页面包含了“includes/secret.inc”,那么试试直接访问可不可行,访问并查看源代码
根据得到的secret输入进去
07 natas7
典型的文件包含|ssrf
home改为../,果然是文件包含,而且是本地文件包含,直接爆出来路径,说明当前路径在/var/www/natas/natas7,
根据源代码的提示找需要的文件
这里需要跳转四级目录
或者直接根目录访问也可以
08 natas8
源代码查看,涉及到简单的代码问题
只需要构造这个解密函数即可,方法是先进行hex2bin,即十六进制转换为二进制,再将字符串反转,再进行base64解密,用在线php运行
输入oubWYf2kBq,得到密码
09 natas9
php执行系统外部命令的函数exec(),passthru(),system(),shell_exec()
1、exec(命令,数组,状态)
exec执行系统外部命令不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。
“echo exec(“ls”)”
2、passthru(命令,返回值)passthru ()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。不需要echo或return来查看结果
passthru(“ls”)
3、system(命令,返回值)
system和exec的区别在于system在执行系统外部命令时,直接将结果输出到浏览器,不需要使用 echo 或 return 来查看结果,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。
system(“ls /”)
可知该题目为命令执行漏洞,根据参数的位置,我们需要使用管道符来分割前面的”grep -i“,指令不能用“&&”。
另外由于后面dictionary.txt的干扰,也需要使用管道符,注意这里不能用“|”分割。
常见的管道符
| 直接执行后面的语句
|| 前面命令错的那么就执行后面的语句,否则只执行前面语句
& 前面后面都执行
&& 前面为假,那么后面的命令就不执行
; 前面后面的命令都执行
我这里使用 | 和 ;分割开
10 natas10
可以看到上一关卡的管道符已经被过滤无法使用,因此只能从grep命令进行分析
grep命令
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来
语法:
grep [options] pattern [files] pattern - 表示要查找的字符串或正则表达式。 files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。参数:
-i:忽略大小写进行匹配
那么这里可以用一个思路就是利用“grep 我们自定义的字符串或者正则匹配 查看的文件名”,并且该命令也能显示符合匹配的一列,那么就可以构造payload
grep -i * /etc/natas_webpass/natas11
即输入框为* /etc/natas_webpass/natas11,但是这里很奇怪,直接显示出该页面的源代码
那么我随便猜测这里*替换为可能的数字或者字母
grep -i 1 /etc/natas_webpass/natas11
grep -i a /etc/natas_webpass/natas11
测试成功
至此,得到第十一关的密码为:1KFqoJXi6hRaPluAmk8ESDW4fSysRoIg
暂时就到这里,等下次再继续玩一玩