密码重置

页面打开如图:

首先我们可以发现user1处是ctfuser的base64编码,我们将其改为admin的base64编码,然后将user=admin&newpass=123(newpass的值随意)&vcode=1234(验证码)post过去,就可以拿到flag.

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);
  }
  return htmlentities($str, ENT_QUOTES);
}

$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){
  die('Invalid password!');
}

echo $flag;

根据源码构造payload:?username=\&password=or+1=1%23获得flag.

综合题

打开页面满屏括号……(当时人是傻的),查了一下知道了是jsfuck,于是直接jsfuck复制下来,在控制台运行,显示出一个php文件名,访问之,看到一句话:

哈哈哈哈哈哈你上当啦,这里什么都没有,TIP在我脑袋里

有端联想一下,脑袋即为头,于是去看头,发现响应头中的tip:history of bash,随后访问/.bash_history,获得信息:zip -r flagbak.zip ./*,访问flagbak.zip,下载下来打开txt文件即可.

SQL注入2

考union查询,源码:
<?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 = $_POST[user];
  $pass = md5($_POST[pass]);
  $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
      echo "<p>Logged in! Key: ntcf{**************} </p>";
  }
  else {
    echo("<p>Log in failure!</p>");
  }
}
?>

题目告诉用union,结合源码中的查询语句构造payload:user=-1′ union select ‘c8dc8fdf774bb5468b9e9cc09eb48384&pass=leuk,其中c8dc8fdf774bb5468b9e9cc09eb48384是leuk的md5值.因为没有-1这个user,所以会返回union select 后的内容,即leuk的MD5值.这样就可以成功登陆拿到flag.

综合题2单独更,此处先跳过.

密码重置2

题目给了三个tip:1.管理员邮箱观察一下就可以找到2.linux下一般使用vi编辑器,并且异常退出会留下备份文件3.弱类型bypass

f12可以找到管理员邮箱,备份文件后缀为.swp,访问.submit.php.swp

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `token` int(255) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可见***', '***不可见***', 0);
*/
if(!empty($token)&&!empty($emailAddress)){
  if(strlen($token)!=10) die('fail');
  if($token!='0') die('fail');
  $sql = "SELECT count(*) as num from `user` where token='$token' AND email='$emailAddress'";
  $r = mysql_query($sql) or die('db error');
  $r = mysql_fetch_assoc($r);
  $r = $r['num'];
  if($r>0){
    echo $flag;
  }else{
    echo "失败了呀";
  }
}

代码中要求token长度为10且==’0′,第三个tip派上用场,令token=0000000000或0exxxxxxxx(xxx处为数字),拿到flag.

 

文末废话:大概明天就会把综合题2写出来,立个flag.

Categories:

Tags:

No responses yet

发表评论

电子邮件地址不会被公开。 必填项已用*标注

闽ICP备19027300号