WEB
1、签到题
进入网页之后只有一行字”key在哪里?”,直接右键,查看网页源代码,
imagenctf{flag_admiaanaaaaaaaaaaa}
2、md5 collision
源码
<?php
$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";}
?>
3、签到2
image这里给了我们一个口令要我们输入,就输入试试。
发现提示的还是“尚未登录或口令错误”。先看看源码:
image发现文本框最大长度限制为10个字符,但要输入的口令长度为11。
image所以我们可以直接修改maxlength为11,输入口令得到FLAG:
image第二种方法就是通过Burp Suite抓包然后修改提交的口令。
image可以看到原始提交的口令为zhiamkaime将其修改为zhimakaimen就可以得到FLAG了。
4、这货不是web
提目提示
真的,你要相信我!这题不是WEB
点击连接看到的是一句话和一张动图,查看源码,发现只有一个2.gif,只有先从这个图片下手了。。
下载下来用notepad++打开,全是乱码(这是肯定的了),直接搜索nctf得到FLAG。
image5、层层递进
依次从网页源代码里点击so.html->so.html->so.htm->so.htm->404.html。最后在源代码找到FLAG,
imagenctf{this_is_a_fl4g}
6、AAencode
是JS的一种加密方式,直接F12扔控制台里就可以直接跑出来。
image
7、单身20年
点击“在这里找key”发现什么东西一闪而过,查看源码发现“./search_key.php”,点击之后瞬间就被转到“no_key_is_here_forever.php”的页面上了。
我们可以F12->setting->Disable JavaScript
image得到KEY
image或者可以用Burp Suite
image image8、你从哪里来
HTTP头部字段参考这篇博客。
这里将Refere:https://google.com/就行了。
9、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=="));?>
关于eval函数这里有一篇文章
将eval改成echo就能显示FALG了。
image10、文件包含
这道题要用到php://filter
可以让文件以base64格式输出,再解码就得到FLAG。
flag:nctf{edulcni_elif_lacol_si_siht}
11、单身一百年也没用
F12答案就在请求头里面
imageFLAG:nctf{this_is_302_redirect}
12、Download
查看网页原码发现
<p><a href="download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM=" target="_blank">星星点灯</a></p>
<p><a href="download.php?url=YnV4aWFuZ3poYW5nZGEubXAz" target="_blank">不想长大</a></p>
这里只有似乎只有download.php这个文件,base64('download.php')=ZG93bmxvYWQucGhw
构造URL=https://way.nuptzj.cn/web6/download.php?url=ZG93bmxvYWQucGhw
下载的到downlaod.php源码
<?php
error_reporting(0);
include("hereiskey.php");
$url=base64_decode($_GET[url]);
if( $url=="hereiskey.php" || $url=="buxiangzhangda.mp3" || $url=="xingxingdiandeng.mp3" || $url=="download.php")
{ $file_size = filesize($url);
header ( "Pragma: public" );
header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
header ( "Cache-Control: private", false );
header ( "Content-Transfer-Encoding: binary" );
header ( "Content-Type:audio/mpeg MP3");
header ( "Content-Length: " . $file_size);
header ( "Content-Disposition: attachment; filename=".$url);
echo(file_get_contents($url)); exit; } else { echo "Access Forbidden!"; }
?>
发现文件hereiskey.php
?url=?url=aGVyZWlza2V5LnBocA==
得到FLAG:nctf{download_any_file_666}
13、COOKIE
TIP:0==not
那么1==yes
在请求头中可以看到:Set-Cookie:Login=0
修改为Login=1,就可以得到FLAG:nctf{cookie_is_different_from_session}
14、MYSQL
一上来就给我们科普robots.txt,就是告诉爬虫那些东西不能爬。
那我们就来访问一下这个文件。
image这里有个intval函数:成功时返回 var
的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
随便输入个大于1024小于1025的小数就行了
FLAG:nctf{query_in_mysql}
15、SQL INJECTION 3
这道题出了点问题,但是思路是GBK宽字节注入。
当我们输入id=',会被显示为id='\''
。'被自动转义为\'
了。
输入id=%df'则会显示为id='運''。\没了。
16、/x00
直接给出了源码
<pre>if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}</pre>
这里ereg有两个漏洞
- %00截断及遇到%00则默认为字符串的结束
- 当ntf为数组时它的返回值不是FALSE
strpos — 查找字符串首次出现的位置
所以有两个方法去攻这道题目
- 令id=1%00%23biubiubiu
- 令nctf为数组则,nctf[]=111
0!==false。
FLAG:nctf{use_00_to_jieduan}
17、bypass again
$_GET()可以处理数组类型的数,但是md5()不能,所以构造参数a[]=1&b[]=2。就可以得到FLAG:Flag: nctf{php_is_so_cool}。
18、变量覆盖
<?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函数。
总的来说就是从数组中将变量导入到当前的符号表。
所以只需要覆盖$pass
和$thepassword_123
让他们相等。
19、PHP是世界上最好的语言
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "<p>Access granted!</p>";
echo "<p>flag: *****************} </p>";
}
?>
这里有两次判断,第一次是把输入的参数id直接和"hackerDJ"比较,要求不能相同。
然后就是经过一次urldeconde之后的参数id与"hackerDJ"比较,要求相同。
其实url编码就是一个字符ascii码的十六进制。
我们可以只对第一个字母h编码,h的url编码是%68,再编码一次就是%2568。
所以令id=%2568ackerDJ,就可以得到FLAG:nctf{php_is_best_language}。
20、伪装者
要求本地登陆才能的到flag。
伪造消息头,添加X-Forwarded-For:127.0.0.1。就可以得到FLAG:nctf{happy_http_headers}。
21、Header
FLAG就在header中。
nctf{tips_often_hide_here}
22、上传绕过
先上传了一个1.txt的文件,提示如下
image再上传一个1.jpg的文件,提示如下
image但是前面已经提示过只允许上传jpg,gif,png类型的。
看第二个错误提示它是**怎么识别文件后缀的 **
它是根据./uploads目录下的basename进行识别的
在我们上传的时候会出现./uploads 在后面添加1.php
会出现这样的提示
imagebasename=1.php1.jpg
所以现在需要在1.php后面进行截断。
首先在/uploads/后面添加"1.php "(这里有个空格)
然后在Hex中找到20(空格的16进制)修改为00,提交就行了。
image23、SQL注入1
这道题直接给出了源码
<pre><?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];
?>
</pre>
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";与 $query = mysql_fetch_array(mysql_query($sql));
一起构成了一条查询语句,my_query()执行的就是上一句中的查询语句。
所以我们可以在user处进行注入,输入“admin')#”可以把后面的password注释掉。可以得到FLAG。
24、passcheck
核心源码
<?php
$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的漏洞,可以参考我的一篇文章。
imageflag:nctf{strcmp_is_n0t_3afe}
25、起名真难
核心代码
<?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';
?>
ord()函数返回字符串的首个字符的 ASCII 值。
这道题就是要输入等于54975581388的数但又不能出现阿拉伯数字。
所以只能换成16进制了,54975581388==0xccccccccc
chinalover.sinaapp.com/web12/index.php?key=0xccccccccc
The flag is:nctf{follow_your_dream}
26、密码重置
Tips:重置管理员账号:admin 的密码
点击连接发现这些东西
image.png
URL中user1后面的字符串用base64解密后是ctfuser。
要求的是修改admin的密码,所以
image.png
27、php反序列化
<?php
class just4fun {
var $enter;
var $secret;
}
if (isset($_GET['pass'])) {
$pass = $_GET['pass'];
if(get_magic_quotes_gpc()){
$pass=stripslashes($pass);
}
$o = unserialize($pass);
if ($o) {
$o->secret = "*";
if ($o->secret === $o->enter)
echo "Congratulation! Here is my secret: ".$o->secret;
else
echo "Oh no... You can't fool me";
}
else echo "are you trolling?";
}
?>
总的来说就是输一个序列化过后的字符串并且类中的变量始终保持相同,这里可以用引用 a=&b。
构造序列化函数
class just4fun{
var $enter;
var $secret;
function just4fun(){
$this -> enter = &$this -> secret;
}
}
echo serialize(new just4fun());
另pass的参数为输出的序列化值就可以得到flag。
28、sql injection4
直接看源码
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;
htmlentities($str, ENT_QUOTES)这个函数会转换双引号和单引号。这里就不能用单引号来就行闭合了,只能用斜杠来进行转义。
相当于查询语句'SELECT*FROME users WHERE name='username' AND pass='password';';
所以当我们就需要闭合name的',而在mysql查询语句中转义字符不参与闭合。所以构造url:?username=&password=or%201=1%23,就可以得到flag。
29、综合题
打开网址出现一串颜表情,直接放到console中跑,得到1bc29b36f623ba82aaf6724fd3b16718.php。我们直接去访问这个页面出现“哈哈哈哈哈哈你上当啦,这里什么都没有,TIP在我脑袋里”这句提示。然后在headers中发现'tip:history of bash'。
搜索了一下发现
Bash shell在“~/.bash_history”(“~/”表示用户目录)文件中保存了500条使用过的命令,这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。
打开这个文件看到zip -r flagbak.zip ./*
的提示。
构造url:teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/flagbak.zip将文件下载并解压得到最后的flag。
31、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>");
}
}
?>
关键代码
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw])))
需要结果集$query
中的md5值和$pass
的相同。
这里$user
和$pass
都是可控的,所以变相的$query
,也可控。
就能得到key。
33、密码重置2
TIPS:
1.管理员邮箱观察一下就可以找到
2.linux下一般使用vi编辑器,并且异常退出会留下备份文件
3.弱类型bypass
在源代码中直接找到了邮箱admin@nuptzj.cn
现在就需要找到token,我们看到提示2,搜了一下发现当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测,如果你正常退出,那么这个这个swp文件将会自动删除。
我们直接找到这个文件:/.submit.php.swp
发现关键代码
image.png
所以令token为0000000000就行了
34.file_get_contents
直接查看源码,看到提示信息。
file_get_contents — 将整个文件读入一个字符串</br>
直接用php伪协议上传file就行了
Snipaste_2019-10-22_13-39-33.png
35.变量覆盖
直接给出了源码:
<!--foreach($_GET as $key => $value){
$$key = $value;
}
if($name == "meizijiu233"){
echo $flag;
}-->
先讲讲foreach()函数,定义如下:
foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:
foreach (array_expression as key => value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
Snipaste_2019-10-22_13-40-58.png第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。
同时这道题还涉及了$$
变量覆盖。
$$这种写法称为可变变量,一个可变变量获取了一个普通变量的值,作为这个可变变量的变量名。
<?php
$a = "hello";
echo "$a\n"; //输出hello
$$a="world";
echo "$a\n"; //输出hello
echo "${$a}\n"; //输出word
echo "$a ${$a}\n"; //输出hello world
echo "$a $hello"; //输出hello world
?>
这里普通变量是'$a'值为'hello',可变变量是'$$a'值为'world',可以看到上例通过将普通变量的值(hello)作为变量名获取到了可变变量的值(world)。
这道题我们传入变量?name=meizijiu233
,通过foreach()函数,进行变量赋值$key=name,$value=meizijiu233
,然后语句$$key=$value
,即$$key=$name=meizijiu233
。
网友评论