危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18982110

一起编写PHP盲注EXP

EXP全称为exploit,也就是漏洞利用程序。经过一段时间的学习,我发现编写EXP也不是大牛的专利,大家也能编写出属于自己的EXP。能够编写EXP的语言很多,比如说c,c~-+,perl,python等名-种语言,不同的语言在不同的环境下有相对应的优势,由于今天写的EXP对应的是一个php的整站系统,所以就使用php编写EXP。

一、前期准备

俗话说的好,工欲善其事,必须利其器,下面就介绍下所需要的前期准备:

php运行环境(包括php5,IIS或者apache)

数据库(php系统一般使用mysql数据库)

代码编写工具(可以使用专业的工具如zend,phpedit.也可以使用notepad-l-+等轻量级工具,当然使用记事本也可以,不过不建议使用记事本)其它辅助工具(如注入工具,抓包工具)php语言基础(这就不用说了,必要的基础是需要的,连漏洞的原理都不懂是写不出EXP的)

这里如果小菜觉得php和数据库不太好搭建,可以使用xampp,安装后就会捂建起php5+mysq15+apache的环境了。由于这篇文章主要是介绍EXP的编写,这里就不具体说安装过程了。

二、漏洞分析

编写的是漏洞利用程序,当然得有漏洞,这里找了一个叫mlcecms的php整站系统,这个系统是基于MVC框架的。这里简单说明下下什么是MVC,MVC是三个单词的缩写,分别为:  模型(Model),视图(View)和控制Controller)。MVC模式的目的就是实现Web系统的职能分工,使用MVC框架可能开始觉得比较麻烦,不过一旦搭建起来,后期的开发和维护旧相当的方便。由于漏洞分析不是主要的地方,这里我就简单讲解下出现漏洞函数。

首先通过POST方式获得了pollcategory_id。然后就带人数据库查询,在带人数据库查询的过程中并没有对pollcategory id进行过滤,因此注入漏洞出现。但是这里为什么称为盲注,那是因为你提交的数据不会在页面上进行显示,而你只有通过弹出的消息判断语句的成功与否。你可能又会说那么我可以用php注入工具啊,但是当我把这个页面的地址告诉你,你就知道这不太可能。这个页面访问的地址,可能一些朋友看出来了,这和普通的注入链接不太一样。也就是说,不论你放在pangolin还是nbsi中,都是没法注入的。那么怎么办呢,这个时候可以通过构造表单的方式进行注入。

这时候我们用浏览器打开这个表单,填入”1 and 1=1”,点击提交,出现空白页面,我们查看页面源代码,出现投票失败语句。

下面我们在表单中填写”1  and l=2”,点击提交,查看源代码,很明显和上面不一样了。这其中不一样的地方就是关键字,也就是判断语句执行成功还是失败的重要条件,由于关键字非常重要,所以我们最好选择便于程序识别的英文语句,这里我选择Pollesults作为关键字。

好了现在关键字选择好了,就可以注入了,如果这么手动的猜解,我们每猜解一个用户就需要上百条的语句,估计从早上开始猜解,猜完一个用户就快要到中午了。因此我们将要将这些过程交给程序来做。

三、EXP编写

通过上面的分析,我们应该就知道编写EXP的必要性了,下面我们就具体开始编写代码。首先危险漫步要说明下,php作为一种脚本语言,一般是通过浏览器访问的。不过EXP-般却是在cmd下运行的,这叫做php的CLI(command-line interface,命令行界面)模式,可在用户提示符下键入可执行指令的界面。

首先写点简单的练下手,也就是写下作者信息或者说叫使用方法的东西。

语句比较简单,我只是说下第9句if($argc!=2&&$argc!=3),其中$argc代表的是参数的个数,比如说我填写的micecms.php localhost /micecms/这Al参数就是3个。那么如果你填写的参数不是2个或者3个,程序就显示使用说明,并且退出。这里我演示一下,这里我输入了3个test,也就是参数多了一个,就显示了如下页面。

要利用这个注入漏洞,就是要程序模拟提交注入语句,其中常见的提交语句给服务器有两种方法,一种是通过fputs方式提交,一种是通过curl提交,网上大多数是通过fputs方式提交的,不过经过我的测试使用curl提交无论是速度还是稳定性都高于fputs方式,所以这里我选择curl方式。下面我就写了一个Send Data函数,首先,$host代表的是主机名,$path代表的是网站路径,比如所如果网站地址为micecms/,那么$host就是,$path为/micecms/。$myheader是发送的http头信息,经过测试,不要头信息也可以成功,不过为了规范和以后写http头注入方便,这里我还是写出来了。下面就是使用curl发送数据,这里说明下,由于是POST注入,所以method使用POST。其中$resp就是服务器返回的代码,程序也就根据返回代码判断注入是否成功。其中curl_setopt是设置各种参数,$data就是我们提交的注入语句,.通过程序自动向服务器发送注入语句,也就比手工速度快多了。

写了发送语句,就要准备注入语句了,这里注入语句有两种方式获得。第一种是通过网上总结的注入语句,然后根据自己的情况进行改动。第二种是通过注入工具找一个可以注入的地方,然后通过WinSock Expert等抓包工具进行抓包,由于抓包在黑手以前很多文章都提到过,这里就不说明。这里我简单的说下—般盲注入的过程。

猜解数据库名长度:

and Length《database()))<8? //如果返回正常说明

数据库长度小于8

猜解数据库名

and ascii(substring((database()),1,1)=122//如果正常说明数据库第一位是z,其中122表示z的ascii码and ascii(substring((database()),2,1))=122//表示猜解数据库第二位

猜解表段长度and Length((SELECT distinct table_name FROM information_schema.tables Where table_schema= Ox6D696365636D73 limit O,1))<10//返回正常表示表段的长度小于1 0,由于系统有可能修改了表的前缀,所以如果服务器的mysql版本高于5.0,可以通过information_schema.猜出表前缀。这里Ox6D696365636D73的是mlcecms的HEX格式。

猜解具体字段值

ascii(substri_ng((SELECT password FROM mice_user LIMIT O,1),l,1))=122//猜解password字段的第一个值,如果返回正常表示第一个字符为z下面进行具体猜解函数的编写,首先GetData函数,为了提高猜解效率,我将数据分成了两部分,—部分数字,一部分字母。如果asci鸸小于58返回正确,那么说明这位是数字,那么就进行数字猜解,否则进入字母猜解。如果$return为真,说明此sql语句正确,也就是猜解成功一位,那么就返回当前ascii

码。由于这段代码是影响EXP效率的关键地方,因此对这里的优化相当的重要,开始我没有对数字和字母进行分类处理。后来进行分类后效率提高了将近30%,当然这里不是最优算法,使用折半查找的方法效率更高,这就交给读者自己写吧。

上面那个函数是获得一个字符,下面这个函数就是将多个字符组成字段值。首先通过chr函数将ascii码变成字符,然后将它保存在$Val这个变量中,一旦猜解完毕,就将这个值返回。

四、测试EXP

通过上面的几个函数的讲解,我想大家应该明白了-PHP的基本思路了,还有些函数我就不一一介绍了。下面我本地测试下EXP的使用。

首先,我们在cmd中找到php的路径,然后输Aexp的路径,填入ip或者网址,后面填入具体的路径,然后回车.EXP就会慢慢的进行猜解了。

下面我们看看使用EXP的效率如何,我先介绍下MICECMS的加密模式。MICECMS的一个账号包括一个用户名,一个40位的shal加密的密码,还有一AI 32为位的salt。也就是手工猜解肯定要花费很多时间的,下面我们看看使用EXP猜解2个账号使用的时间。使用EXP只花费了62秒就猜解了两个账号,可见效率还是比较可以的。不过如果测试远程网址,就跟本地网速和远程网站的网速有很大的关系了,经过我的测试,在网速正常的情况下,1个账号在2分钟内还是可以猜解出来的,虽然说速度肯定不能和uriion杏-询相比,不过至少说比手动猜解块多了。

五、后记

可以说写EXP是一个新人慢慢向上提高的必经阶段,我也在学习的阶段,所以代码的规范性和效率还有待提高。由于篇幅有限,我也没有讲解所有的代码,我会将代码留下,如果有不足之处希望大家和危险漫步一起交流学习。