许久未见
距离上一次写笔记对我来说已经很久了,不是不想写了(有一点,或许?),而是为了抓紧进度就没有时间去大量的写笔记,再加之自己并不是没事情做专门学习所以落下来了,现在要把笔记补一补,然后开始新的进展。
跟着某种神奇获得的课程,我已经完成了大部分基础知识的学习,但很明显的是我没有完全记住。这也正是整理笔记的重要性,但是我又不能把其都看一遍或者怎样,所以笔记必定不像之前那么详细,其实也说不准。目前就是把整体的都串一遍,以便巩固还有查找,之后开始学习深入和其他方面知识了。
文件上传漏洞
当我们使用的服务并没有对文件进行全面详细的校验,那很明显上传上去的东西是比较危险的。攻击者可能会上传一些可以被服务器当成语言执行的文件,从而获取信息或者掌握服务器权限之类。
服务器通过前后端的联合,将用户上传的文件进行传输和保存。
php的解析是事实的,就可能会出现上传的文件被当作php语言执行。
在php当中,存在着一些如果不正确使用就会出现危险的函数,比如:
eval("system('ls /');");
assert("phpinfo()");
array_map("assert",array("phpinfo()"));
call_user_func();
call_user_func_array("assert",array("phpinfo();"));
//当然,这些函数在配置文件当中都可以被选择性地禁止。
他们可能会用来执行系统命令操作,或者读取到一些服务器信息。
通常在打比赛等环境下,如果能上传文件,那使用最多的应该就是一句话木马。在php当中是这样书写的:
<?php @eval($_POST['wow']); ?> //或者使用上面说到的其他函数,前面的`@`符号是在php当中抑制报错使用的,意味着即使出现错误信息也会被忽略。
因为大部分的服务器都是运行在Linux或者Unix系统下的,所以更多使用的是命令行操作。
我们使用的通常会包含图形化界面,可以使用安全行业使用比较多的鹦鹉系统或者kali系统来完成学习和操作。
这里具体的命令行大家可以找到很多的相关资料,略过。
这里重点说一下查找文件和目录的两个命令:
find <目录> -name <名字>这里应该是会在这个目录下递归的寻找含有目标名字的文件。
grep -r "flag" <目录>查找文件当中存在flag的文件。
还有值得一提的是set或者是env会存在环境变量信息,有时候flag会存在这里面。
之后就是前端校验还有后端校验了,这里不想深入地说。简单来说,就是前端校验可以通过使用burp抓包或者yakit抓包修改数据来实现绕过。
后端校验就是需要改变以下不常用的文件名,比如在早期或者程序员预定义会被当成语言解析的文件名后缀,比如php1,php2,一直到php7,phtml等。后端校验又很多种,比如会同时检验你的报文当中的相应字段,比如Content-Type: image/jpg等形式才能通过校验。
有的会对文件内容进行检测,有一些可以通过添加GIF89a来绕过,它是gif文件的特征信息,其他的格式图片等会出现不可打印字符,这里就不说了。
还有的会看内容当中是否出现php的特征代码<?php,这时候如果允许可以使用<script language='php'></script>的方式达到绕过,其实还有其他的代码风格,以后如果遇到可以说以下,比如<? ?>和<% %>等形式。
还有的如果不是正则表达式过滤或者其他方式严格过滤,可能通过对<?php进行随机大小写绕过。更多的则是综合起来使用,总的来说没有先后顺序,可以不断尝试。
还有就是一些起站的工具如果配置不当会出现的问题,比如.htaccesss配置文件,它是apache服务器当中配置相应网页的文件,通过它可以实现网页的301重定向和404页面定制、改变扩展名、对用户进行权限限制和访问、禁止目录列表、配置默认文档等功能。
<FilesMatch "wow.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
自己写一个这个文件,把上面的内容写进去,然后传进去服务器相应目录。
上面的功能就是将wow.jpg当成php去解析。
还有一些比较明显的情况下,可能会让你看到你上传成功之后被处理过之后的文件的后缀的情况,那个时候就需要和SQL注入的时候一样进行双写绕过,不过视情况而定。
还有就是如果服务器使用fastcgi启动的时候,.user.ini是php的一种配置文件。
.user.ini是一个php的配置文件。被动态加载,不需要重启服务,过一段时间之后就会被加载。
其中有两个属性,可以让php文件都自动包含某个文件,它们分别是在文前包含,一个是在末尾包含。它们更像require包含,出现错误会停止运行。
可以这样写:
.user.ini
GIF89a
auto_prepend_file=wow.jpg
auto_append_file=wow.jpg
短标签绕过就是之前所说的那些东西,其中还有一种:
<?=$a?> //获取后台非私有变量或表达式结果<?=$a?> <?=(表达式)?>
<?=eval("system('ls');") ?>
还有就是对于命令行操作等各种场景下可能会有目录穿越的需要,这也不需要我讲,略过。
还有一个是00截断,编码为00的字符是一个空字符NULL,当写在字符串当中,其后的字符串会被忽略(大概是这样讲),因为早期语言当中函数依赖null来表示字符串结束。
其实还有很多类型的一句话木马,但是只不过是使用的函数或者创建方式不同而已,在这里就不详细说明了,有些方法也在后续php版本当中得到禁用。
再比如说其中的assert()在7.2版本之后不再可以将参数当作语句执行,增强安全性。