Web Hacking技巧(二)

在这一部分,我们将简单介绍一下目录遍历和关于爬虫的爬取网页关键信息的Tips。

练习八 目录遍历

图:一个简单的查看文章内容的网页

在本次练习中,需要我们打开PathTraversal目录,在目录中,index.php包含了一个简单的提交GET请求的方法,该方法可以将提交的GET请求发送到服务器然后实现将文本内容显示出来的功能。当我们点击“View article”的时候,将会触发以下PHP代码:

执行的结果就是会转向这个网址:http://localhost/2/PathTraversal/?article=1.htm

然后浏览器会根据GET请求载入这篇文章,文章的参数经由下面的代码生成:

现在,一个合法的用户就可以通过这个代码的请求接口直接调用查浏览一些合法文章了。当然对于一个攻击者来说,想要的可不仅仅是这些。相比于这些合法的文章,不想被直接公开看到的服务器的一些配置文件更有吸引力。那么,接下来让我们看看我们能不能成功过获取到这些重要的数据。

我们的任务

1、返回一个目录路径,通过修改URL的参数值打开openme.txt文件

2、前提假设我们只能通过本地服务器访问这个目录(仅从浏览器下手。当然实际情况也多是这样的),同时我们也不知道这个目录下有什么文件。

首先第一步我们需要看一下这个目录是否存在

跳转到目录路径的时候我们发现这个目录是存在的,同时我们可以看到这个目录是通过HTTPAuth方式进行了加密。你的任务是通过某种方式找出用户名和密码,不过这里我们不用之前的暴力破解的方式了。

Tips

如果我们已经知道在这里目录使用了HTTPAuth的方式加密,我们就应该很自然联想到服务器上存在一个.htaccess文件。因此,我们可以打开这个文件从中寻找一些食材。但是这里我们没办法直接接触到文件,所以我们需要用一些非常规的手段——目录遍历。在上面的叙述中,我们可以看到php文件中并没有对查看的文件进行过滤,我们可以尝试直接利用php进行文件查看。

我们在地址栏输入http://localhost/2/PathTraversal/?article=config/.htaccess,我们发现文件内容是可以被暴出来的

既然如此,我们就可以输入userlist.htpasswd文件名,然后将所有的用户名和密码暴出来:

那么接下来的工作就是破解这段密文。HTTPAuth使用的是UNIX的CRYPT(3)进行的单向加密,具体的解密方式大家可以去网上找一下。

使用目录遍历,我们可以找到很多有用的文件,比如可以通过查看php.ini文件获取到一些重要的配置参数。

一个简单的解决思路

 

这样修改之后,我们不必使用全部的文件名来查看文章而只需要用不带后缀的文件名就可以了,因为我们的代码只允许.htm文件被访问,文章的形式将如下所示:

(我们会发现目前很多国外的个人网站或者blog都是采用的这种方式来屏蔽一些额外的攻击问题的)

那么我们再次进行检测这样是否起到作用。

当我们输入一个不存在的文件之后,我们发现了另外一个问题——php给出了一个warning,这个问题直接导致了信息泄漏。

解决这个问题的方式是修改php.ini配置文件将display_errors参数配置关掉。

那么当我们再次访问一个不存在的文件的时候,错误信息就让我们很满意了。同时,这个访问功能也能很好的解决目录遍历的问题。

小提示:

在旧版本的PHP中(≤5.5.3),我们可以通过修改后缀中的“.”为%00绕过这个后缀名检测

php中的检测机制if (!file_exists($article . “.htm”))可以被以下代码成功爆掉:

http://localhost/2/PathTraversal/?article=accounts.txt %00

“accounts.txt.htm”文件中的htm会因为%00特殊字符直接被服务器过滤掉然后绕过我们的过滤机制。

关于爬取个人信息的Tips

我们都知道很多情况下我们会使用<a href=mailto:[email protected]>Mail Me!</a>这样的格式插入我们的网页以便于别人联系到我们。但是这却在某种程度上泄露了我们的个人信息,可能导致我们的个人Email被爬虫爬走导致我们的邮箱中满是垃圾邮件。而且爬取这些内容并不是一个很困难的事。

这里我们举例说明。我这里写了一个简单的脚本文件,结合https://meanpath.com/(类似于钟馗之眼和shodan之类的分布式爬虫站点),可以获取到“mailto:”和<a
href=”tel: xxx-xxx-xxxx”>这类关键字的一些信息。这里,因为MeanPath的限制,我们只获取到了100条信息。

这里我们可以使用正则表达式来匹配包含特殊字符的邮件地址,对于电话号码,则仅需要符合 xxx-xxx-xxxx的格式就可以了。同时我们的代码还需要保证我们爬取的内容在列表中不会出现重复。

下面是我们的代码部分(这里作者给出了一个不错的搜索已有代码的站点,可以简化我们的工作http://www.nerdydata.com):

首先是代码的第一部分,在这一部分中,我们创建了一个MeanPath类,然后包含了一个mine_elements()函数,该函数的作用是将所有MeanPath搜索到的结果放在一个组中。另一个函数filter_elements()是用来挑出符合条件的数据,同时保证了不会出现重复数据:

代码的第二部分。display_data()函数负责将浏览器的数据显示出来,save_data_to_file()函数负责将我们挑出的数据存为一个文件,文件名随机。

这样,我们就将网页中的邮箱信息爬取出来了。

另外,其实我们经常使用的例如sample[at] sample [dot] com或者sample[at] sample .com等方式进行的“加密”来防止爬虫其实意义不大,并没有使我们的数据安全很多,因为我们只需要写一个正则来将其替换匹配就可以了

总结

文章主要偏重于基础,因为很多内容相比于Hacking倒不如说是普及,所以这里只是选择性的进行了搬运。关于文章中部分代码下载地址在这里:

链接:http://pan.baidu.com/s/1bn8gp9X 密码: 5wah

文章最后附上一个关于web hacking的小册子,里面详细总结了一些常用的策略和工具,指导性的干货还是不少的:

链接:http://pan.baidu.com/s/1ntKDizf 密码: xgji

哦对了,小册子是英文版的。:)

<特别说明>

这里需要特别说明一下,原文的内容本来比本文搬运的内容要多,但是由于作者本人在PartII和PartIII部分的练习code缺失,而我们暂时未能联系到作者本人,所以针对思路我们进行了部分修改和精简,如果我们能与作者本人联系到,会将剩余部分进行编辑后展示给大家。

</特别说明>