week one
1 /x00
提示:有多种解法,你能找到几种
源码:
writer up:
题目直接给出了源码,get 到一个 nctf 这个变量,int ereg(string pattern, string originalstring, [array regs]);
,ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false,这里需要输入的是全数字,但是 ereg存在一个截断漏洞,即当字符串匹配中出现 %00(NULL)是,匹配截止。所以我们可以在输入字符串的时候,在字符串里面添加一个%00,然ereg函数截至,有因为在遇到 %00 之前的字符串是满足全是数字的所以 ereg 函数返回 TURE 。 strpos()函数,返回一个字符串中子字符串第一次出现的位置,即输入的字符串里面有"#biubiubiu",即可得到flag
方法1:使用 %00 ,截断,构造payload,nctf=1%00%23biubiubiu,这里的#使用url编码,然后得到flag
方法2:百度了一下用数组绕过。
2 Cooke
提示:0 == not (那不能0 不就好了)
writer up:
3 PHP decode
提示:
源码
<?php function CLsI($ZzvSWE) { $ZzvSWE = gzinflate(base64_decode($ZzvSWE)); for ($i = 0; $i < strlen($ZzvSWE); $i++) { $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1); } return $ZzvSWE; } eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==")); ?>
writer up:
以前做过类似的题,先运行一遍,看看有什么变化,但是这个没有输出,注意到没有输入,然后把后面的eval改成echo ,顺利输出 flag
4 bypass again
提示:又是php弱类型。
源码:
writer up:
当看到这个源码的时候,第一反映,”==“双等号,直接两个用md5弱类型
方法:构造payload, a=s878926199a&b=s155964671a
5 变量覆盖
提示:变量覆盖
源码:
writer up:
extract()函数漏洞
方法:构造payload ?pass=a&thepassword_123=a,得到flag
6 SQL注入1
核心源码:
<?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>"); } }
writer up:
对两旁的空格去掉,在进行sqi语句拼接,
$sql="select user from ctf where (user=' ".$user." ') and (pw=' ".$pass." ')";
如果是admin用户,就可以直接得到flag,所以我们构造一个payload使得前面的user=admin,后面的pw被注释掉,这样就可以了,在mysql语句中,有三种注释方法 /**/ 多行注释,’--‘ 和‘#’都是注释到行尾。
所以可以构造一个payload
user=admin')#pass=123 ,闭合前面的user=' "XXX" ') 所以这里就需要添加一个“ ’) ”用来闭合前面。然后用” # “来注释掉后面的pass,这样就能无视密码直接登录,得到flag
7 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!"; } ?>
writer up:
这里用到了strcmp()函数进行了比较,
这里也考察了php的弱类型,即当传入的为一个数组时,会返回NULL,所以运用这个特性,
payload : pass[]=123
(拿到这个题目就先抱着试一试的心态去直接post一个数组,居然成功了,然后去百度了一个strcmp()函数)
8 起名字真难
源码提示:
<?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) ) { return false; } } return $number == '54975581388'; } $flag='*******'; if(noother_says_correct($_GET['key'])) echo $flag; else echo 'access denied'; ?>
writer up:
这里的noother_says_correct($_GET['key'])中需要传入一个Key ,但是
for ($i = 0; $i < strlen($number); $i++) { $digit = ord($number{$i}); if ( ($digit >= $one) && ($digit <= $nine) ) { return false; } } return $number == '54975581388'; }
传入了一个key之后,对key中的每一位取ascll码,但是当取回的ascll码是0~9是会返回false,而且要number == 54975581388, 所以这里就很头大,可以考虑一下用16进制试一试
发现54975581388 = 0xccccccccc
构造payload
?key=0xccccccccc
9 密码重置
提示:
重置管理员账号:admin 的密码
writer up:
看到这个题的时候,先随便试一下,用burpsuit抓一个包,发现无论怎么改“newpass”这一项都没有变化,都是error。
突然注意到了
然后把上面的user1=Y3RmdXNlcg==换成 'user1=YWRtaW4=' (admin), ctfuser换成admin,得到flag
10 实战题 1
writer up:
打开网站后是一个好大一片的字符,直接扔到控制台,得到 1bc29b36f623ba82aaf6724fd3b16718.php 这个东西,访问一下http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/1bc29b36f623ba82aaf6724fd3b16718.php 感觉。。
用burpsuit 抓了一下包,什么东西都没有,提示tip在脑袋里,翻翻http头,咦,有一个东西。tip: history of bash ,这个不就是tip啊,
可是这个history of bash是个什么东西,,百度啊百度,还是搞不懂是个什么东西,而且都是 用的 bash_history ,好不容易翻到了一个这么用的 /.bash_history 试一下把,http://teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history
哟成功了,哈哈哈,里面得到了一个命令个一个文件路径
嘿嘿嘿,连接路径,下载,打开得到flag
还是不懂linux里面的bash_history 是个什么东西。means what???