CG_CTF web篇(中)

变量覆盖

点开source.php,查看源代码

<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
                        <?php
                        extract($_POST);
                        if ($pass == $thepassword_123) { ?>
                            <div class="alert alert-success">
                                <code><?php echo $theflag; ?></code>
                            </div>
                        <?php } ?>
                    <?php } ?>

看到extract()函数,再根据题目,可以知道这是extract()函数的变量覆盖,$_POST类型
了解变量覆盖漏洞https://www.freebuf.com/column/150731.html
所以利用extract()函数和post传输,覆盖原有的 $pass 和 $thepassword_123变量,赋值使他们相等得到flag
在这里插入图片描述

PHP是世界上最好的语言

好像是挂了

伪装者

提示了只能在本地登录,所以利用client-ip伪装成在本地登录
利用Firefox的工具ModHeader
在这里插入图片描述
打开题目网址,打开ModHeader工具
输入
在这里插入图片描述
刷新一下得到flag
在这里插入图片描述

Header

好像也挂了

上传绕过

也是不能抓包。

SQL注入1

打开题目是一个简单的登录页面,点击source查看源代码,寻找注入点。

<?php
if($_POST[user] && $_POST[pass]) {
    mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $user = trim($_POST[user]);
  $pass = md5(trim($_POST[pass]));
  $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
    echo '</br>'.$sql;
  $query = mysql_fetch_array(mysql_query($sql));
  if($query[user]=="admin") {
      echo "<p>Logged in! flag:******************** </p>";
  }
  if($query[user] != "admin") {
    echo("<p>You are not admin!</p>");
  }
}
echo $query[user];
?>

trim()函数的作用是去除字符串左右两边空格
密码经过md5加密
$query[user]==“admin"从这一句知道user为admin
依然不知道密码
选择在user注入,把密码处注释掉
select user from ctf where (user=’ “admin” ‘)#’) and (pw=’”. $pass."’)";
从登录页面对应源代码,只有上面 " $user"和 " $pass"这里可以插入语句
知道user后选择在user插入admin’)#
admin后面的 ’ 和 ) 是用来闭合,前面也用了 ’ 和 ) 来括住admin
#作为注释符号,把后面要求输入密码当成注释,不再起执行作用
在这里插入图片描述
密码随意

pass check

查看源代码

$pass=@$_POST['pass'];
$pass1=***********;//被隐藏起来的密码
if(isset($pass))
{
if(@!strcmp($pass,$pass1)){
echo "flag:nctf{*}";
}else{
echo "the pass is wrong!";
}
}else{
echo "please input pass!";
}
?>

stcmp()函数用法https://www.w3school.com.cn/php/func_string_strcmp.asp
在这里插入图片描述
因为strcmp前有!
所以当pass和pass1两个变量相等时输出flag
但是不知道pass1
所以运用strcmp()函数是一个弱函数的性质
并且strcmp(array,string)返回NULL
所以构造pass数组
在这里插入图片描述

起名字真难

<?php
function noother_says_correct($number)
{
       $one = ord('1');
       $nine = ord('9');
       for ($i = 0; $i < strlen($number); $i++)
       {   
               $digit = ord($number{$i});
               if ( ($digit >= $one) && ($digit <= $nine) )//变量digit不能是字符1到9
               {
                       return false;
               }
       }
          return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))//参数key要等于字符串'54975581388'
   echo $flag;
else 
   echo 'access denied';
?>

所以输入的字符不能为1到9,可要输入的那一串全部都是在1到9里的字符
所以尝试用十六进制绕过
54975581388的十六进制是0xccccccccc
所以
在这里插入图片描述
得到flag

密码重置

因为找回的是admin的密码,但是user却不是admin,并且不能删
新密码随便设
这些都是post传递
又发现url上面的一串base64字符串解码后正是ctfuser
所以我们也把admin用base64编码
把信息用post传递
在这里插入图片描述

SQL Injection

打开F12看到源码

#GOAL: login as admin,then get the flag;
error_reporting(0);//不报错
require 'db.inc.php';

function clean($str){
	if(get_magic_quotes_gpc()){
		$str=stripslashes($str);//删除由 addslashes() 函数添加的反斜杠。
		}
	return htmlentities($str, ENT_QUOTES);//把单引号和双引号转为HTML实体
}

$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);

$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){// ||代表或,有!,打开的页面证明这个if成立,所以!$result和mysql_num_rows($result) < 1 至少一个为真
	die('Invalid password!');
}

echo $flag;

已知登录账户是admin
因为把输入的单引号和双引号转为HTML实体,这样子就不能闭合$username然后用#把密码注释掉了
所以换一个思路,可以用 ‘\’ 使单引号转义
‘SELECT * FROM users WHERE name=’’**admin\ ** ‘’ AND pass=’’ or 1 = 1 #’’ ; ’ ;
加粗:admin是账户
\ 是用来转义后面的单引号相当于admin后面不立刻闭合
or 1 = 1使密码无论如何都正确
#用来注释后面多余的引号,避免错乱
把转义去掉相当于
SELECT * FROM users WHERE name=’ admin ’ AND pass=’ or 1 = 1 #
所以
在这里插入图片描述
%20是空格,%23是#

magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误,转自https://www.cnblogs.com/lemon66/p/4224892.html

stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

在这里插入图片描述
自https://www.w3school.com.cn/php/func_mysql_query.asp

htmlentities() 函数把字符转换为 HTML 实体。
在这里插入图片描述

mysql_num_rows() 函数返回结果集中行的数目。

综合题

一打开就是jsfuck密码,在控制台里把密码跑一遍
在这里插入图片描述
得到一个php文件,尝试访问
在这里插入图片描述
在这里插入图片描述
打开之后一瞬间懵
其实脑袋就是headers,tip就在脑袋里
打开F12的network,F5载入网页,查看到tip是history of bash
.bash_history文件会让你 重用你 使用过的命令 (!+命令数字)
(1)每个用户的主目录下都定义了一个.bash_history文件
(2)许多发行版会记录用户前次输入的1000条命令
(3)可以使用 .bash_history 来查看历史记录
就是这个文件记录了用户操作的历史,可以访问这个文件查看
.bash_history https://blog.csdn.net/QI8811481/article/details/98888777
在这里插入图片描述
在这里插入图片描述
zip -r是Linux下zip的打包和解包
也可以直接访问 flagbak.zip,下载zip
http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/flagbak.zip
下载得到flag
在这里插入图片描述

发布了19 篇原创文章 · 获赞 0 · 访问量 258

猜你喜欢

转载自blog.csdn.net/weixin_45689999/article/details/104491123