- A+
//If the article GET parameter is set
if (isset($_GET["article"])) {
// Create a div block and fill it with the contents from the file in the GET value.
echo "<div id='article'>" . file_get_contents($_GET["article"]) . "</div>";
}
?>
执行的结果就是会转向这个网址:http://localhost/2/PathTraversal/?article=1.htm
然后浏览器会根据GET请求载入这篇文章,文章的参数经由下面的代码生成:
现在,一个合法的用户就可以通过这个代码的请求接口直接调用查浏览一些合法文章了。当然对于一个攻击者来说,想要的可不仅仅是这些。相比于这些合法的文章,不想被直接公开看到的服务器的一些配置文件更有吸引力。那么,接下来让我们看看我们能不能成功过获取到这些重要的数据。
1、返回一个目录路径,通过修改URL的参数值打开openme.txt文件
2、前提假设我们只能通过本地服务器访问这个目录(仅从浏览器下手。当然实际情况也多是这样的),同时我们也不知道这个目录下有什么文件。
首先第一步我们需要看一下这个目录是否存在
跳转到目录路径的时候我们发现这个目录是存在的,同时我们可以看到这个目录是通过HTTPAuth方式进行了加密。你的任务是通过某种方式找出用户名和密码,不过这里我们不用之前的暴力破解的方式了。
如果我们已经知道在这里目录使用了HTTPAuth的方式加密,我们就应该很自然联想到服务器上存在一个.htaccess文件。因此,我们可以打开这个文件从中寻找一些食材。但是这里我们没办法直接接触到文件,所以我们需要用一些非常规的手段——目录遍历。在上面的叙述中,我们可以看到php文件中并没有对查看的文件进行过滤,我们可以尝试直接利用php进行文件查看。
我们在地址栏输入http://localhost/2/PathTraversal/?article=config/.htaccess,我们发现文件内容是可以被暴出来的
既然如此,我们就可以输入userlist.htpasswd文件名,然后将所有的用户名和密码暴出来:
那么接下来的工作就是破解这段密文。HTTPAuth使用的是UNIX的CRYPT(3)进行的单向加密,具体的解密方式大家可以去网上找一下。
使用目录遍历,我们可以找到很多有用的文件,比如可以通过查看php.ini文件获取到一些重要的配置参数。
一个简单的解决思路
//判断GET参数是否被设置
if (isset($_GET["article"])) {
//将路径中所有的”.”
”/”符号全部从GET请求中移除,因为这可能导致目录遍历
$article = str_replace(array("/", "."), "",
$_GET["article"]);
//如果文件不存在,给出常规错误提示
if (!file_exists($article . ".htm")) {
echo "<h1>The article does not exist!</h1>";
}
else {
//当且仅当目录存在的时候,显示其内容
//创建一个div block
//建一个文件扩展名限制,仅允许html文件被访问呢
echo "<div id='article'>" . file_get_contents($article .
".htm") . "</div>";
}
}
这样修改之后,我们不必使用全部的文件名来查看文章而只需要用不带后缀的文件名就可以了,因为我们的代码只允许.htm文件被访问,文章的形式将如下所示:
(我们会发现目前很多国外的个人网站或者blog都是采用的这种方式来屏蔽一些额外的攻击问题的)
那么我们再次进行检测这样是否起到作用。
当我们输入一个不存在的文件之后,我们发现了另外一个问题——php给出了一个warning,这个问题直接导致了信息泄漏。
解决这个问题的方式是修改php.ini配置文件将display_errors参数配置关掉。
那么当我们再次访问一个不存在的文件的时候,错误信息就让我们很满意了。同时,这个访问功能也能很好的解决目录遍历的问题。
我们都知道很多情况下我们会使用
这里我们举例说明。我这里写了一个简单的脚本文件,结合https://meanpath.com/(类似于钟馗之眼和shodan之类的分布式爬虫站点),可以获取到“mailto:”和<a
href=”tel:xxx-xxx-xxxx”>这类关键字的一些信息。这里,因为MeanPath的限制,我们只获取到了100条信息。
这里我们可以使用正则表达式来匹配包含特殊字符的邮件地址,对于电话号码,则仅需要符合xxx-xxx-xxxx的格式就可以了。同时我们的代码还需要保证我们爬取的内容在列表中不会出现重复。
下面是我们的代码部分(这里作者给出了一个不错的搜索已有代码的站点,可以简化我们的工作
首先是代码的第一部分,在这一部分中,我们创建了一个MeanPath类,然后包含了一个mine_elements()函数,该函数的作用是将所有MeanPath搜索到的结果放在一个组中。另一个函数filter_elements()是用来挑出符合条件的数据,同时保证了不会出现重复数据:
代码的第二部分。display_data()函数负责将浏览器的数据显示出来,save_data_to_file()函数负责将我们挑出的数据存为一个文件,文件名随机。
这样,我们就将网页中的邮箱信息爬取出来了。
另外,其实我们经常使用的例如sample[at]sample[dot]com或者sample[at]sample.com等方式进行的“加密”来防止爬虫其实意义不大,并没有使我们的数据安全很多,因为我们只需要写一个正则来将其替换匹配就可以了
文章主要偏重于基础,因为很多内容相比于Hacking倒不如说是普及,所以这里只是选择性的进行了搬运。关于文章中部分代码下载地址在这里:
链接:
文章最后附上一个关于webhacking的小册子,里面详细总结了一些常用的策略和工具,指导性的干货还是不少的:
链接:
哦对了,小册子是英文版的。:)
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫