南邮ctf之web之wp
下面是所有现在可以做的web题的wp!
建议使用CTRL+F查找所需题目,我都有标注!这样方便!
1、签到题

直接查看源码即可

2、md5 collision

解读代码:
$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";}
经典的md5加密题:个人感觉这题考的就是两个等于号,双等于号漏洞,也就是可以通过0e,科学计数法绕过的!所以只要前面是0e开头的md5加密的也就基本可以了,也不需要找,这个百度一大堆的!
md5('s878926199a')=0e545993274517709034328855841020
md5('s155964671a')=0e342768416822451524974117254469
找了两个,随意选一个就行了!还有很多可以自己收藏!

3、签到题2

打开题目地址是这样的!
像这种类型的一般就是输入框长度被限制了,所以直接右键点击检查,改一下就行了!


其实11也就行了,这样的题就这样的套路,比较简单!再遇到一些做sql注入啥的被限制了长度都可以这样改!
4、这题不是WEB
点开题目地址发现是一张图片!

这样的题,首先先看一下源码,或者检查一下F12看里面是否存在,若不存在那应该再图里面了!下载图片,拉进HEXEdit里面查看,再最后发现flag!是个图片隐写了!

5、层层递进
点开题目地址是这样的!

还是直接点击查看源码,和右击检查,都是老套路,也就不多说了!
再检查源码的时候发现:一个SO.html点击去查看~!~

然后发现有个404.html!

再点击去看:

点击检查:发现flag

6、AAencode

很不幸,这个不能做了,原来还可以,应该是帮aaencode.txt文件给删除了吧,就说说这样的解码吧,这个解码也就是一些符号组成的,一般只要放在控制台里面就可以了!

如果不行再找一下解码的平台啥的!
http://utf-8.jp/public/aaencode.html 度娘里面一大堆!下一题!
7、单身二十年
有点意思,看看题目:

看题么应该是个闪图啥的!或者快速跳转啥的,这种的用burp就比较简单了!进题目地址看看!

是个跳转页面,不要怕我们有神器==burp==

直接出来,burp不会的那自己去百度一下吧!各种骚姿势!
8、php decode
看代码吧:
<?php function CLsI($ZzvSWE) { $ZzvSWE = gzinflate(base64_decode($ZzvSWE)); //将传进来的参数$ZzvSWE进行base64解密 for ($i = 0; $i < strlen($ZzvSWE); $i++) { //循环体 $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1); //chr — 返回指定的字符(ascii值) ord — 转换字符串第一个字节为 0-255 之间的值 } return $ZzvSWE; } eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==")); //eval可以解析php代码,所以此题只需要帮eval改为输出就行了,echo、print,这样
$ZzvSWE也就被赋值了所echo的值!
?>
一看代码,发现这是个加解密的题目呀!
代码解析在上面,这个开启我的study,代码运行起来才能发现问题!

9、文件包含

文件包含,那就涉及到了伪协议,所以还是先做题!
这里使用一个php://filter/read/convert.base64-encode/resource=xxx.php,转为base64这样就能得到源码了!

再解码也就得到了源码:https://base64.supfree.net/ 解码地址、也可以自己用base64-decode(.......)来解码!
解码发现flag!

既然可以伪协议我再看看能否用一句话连接接!
发现想多了,哈哈哈!

做题要联想,这样才能加强自己的实力,虽然我还是个小白,小菜鸡,我会努力的,加油!
10、单身一百年也没用(这题目有点狠,单身一百年,一辈子光棍呗,哈哈哈)
题目地址点开发现还是跳转,不多说,上神器burp!

11、Download~!
这题不能做唉!
12、COOKIE(题目提示COOKIE就是甜饼的意思~TIP: 0==not)
这种有COOKIE的还是直接抓包看比较舒服!上burp!

发现有个Login=0,根据题目意思,0一般是假或者空,改为1,试试!
13、MYSQL


robots.txt?这个文件一般只要是个网站都会有的,相当于加载一些网站的一些xxx.php等文件名啥的!

代码吧:
一般sql注入我都直接sqlmap跑了,这个手注一波吧,讲解原理!
1、主要看一个函数intval() 函数用于获取变量的整数值。(这题的关键点)
2、再看if语句,这个需要id=1024就输出 no!try again,否则输出查询语句,应该是出flag的!
<?php echo intval(42); // 42 echo intval(4.2); // 4 echo intval('42'); // 42 echo intval('+42'); // 42 echo intval('-42'); // -42 echo intval(042); // 34 echo intval('042'); // 42 echo intval(1e10); // 1410065408 echo intval('1e10'); // 1 echo intval(0x1A); // 26 echo intval(42000000); // 42000000 echo intval(420000000000000000000); // 0 echo intval('420000000000000000000'); // 2147483647 echo intval(42, 8); // 42 echo intval('42', 8); // 34 echo intval(array()); // 0 echo intval(array('foo', 'bar')); // 1 ?>
所以直接构造payload,利用小数绕过if!

14、GBK Injection

宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入
宽字节注入原理即是利用编码转换,将服务器端强制添加的本来用于转义的\符号吃掉,从而能使攻击者输入的引号起到闭合作用,以至于可以进行SQL注入。
这里的宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字的范围),而当我们输入有单引号时会自动加入\进行转义而变为\’(在PHP配置文件中magic_quotes_gpc=On的情况下或者使用addslashes函数,icov函数,mysql_real_escape_string函数、mysql_escape_string函数等,提交的参数中如果带有单引号’,就会被自动转义\’,使得多数注入攻击无效),由于宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,将后面的一个字节与前一个大于128的ascii码进行组合成为一个完整的字符(mysql判断一个字符是不是汉字,首先两个字符时一个汉字,另外根据gbk编码,第一个字节ascii码大于128,基本上就可以了),此时’前的\就被吃了,我们就可以使用’了,利用这个特性从而可实施SQL注入的利用。
最常使用的宽字节注入是利用%df,其实我们只要第一个ascii码大于128就可以了,比如ascii码为129的就可以,但是我们怎么将他转换为URL编码呢,其实很简单,我们先将129(十进制)转换为十六进制,为0x81,如图1所示,然后在十六进制前面加%即可,即为%81,任意进制在线转换网站请点击此处!另外可以直接记住GBK首字节对应0×81-0xFE,尾字节对应0×40-0xFE(除0×7F),则尾字节会被吃点,如转义符号\对应的编码0×5C!另外简单提一下,GB2312是被GBK兼容的,它的高位范围是0xA1-0xF7,低位范围是0xA1-0xFE(0x5C不在该范围内),因此不能使用编码吃掉%5c。
原文链接:https://blog.csdn.net/william_munch/article/details/100037244
这位博主说的原理挺好的,所以我就转载使用一下了!
所以再写数据库时还是最好使用utf-8比较安全的!
使用%df和'就会转义为 運 这样就绕过一些安全函数了!下面是payload,所以我也不再截图了!
payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,database()--+ 回显:sae-chinalover payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()--+ 回显:ctf,ctf2,ctf3,ctf4,gbksqli,news 应该是这个gbksqli这个表!!! payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name = 0x67626B73716C69--+ 回显:flag payload:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,flag from gbksqli--+ 回显:nctf{gbk_3sqli}
这里的#过滤了所以使用的是--+
15、/x00
看代码吧:
view-source:
if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE) //ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
echo '必须输入数字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE) //strpos() 函数查找字符串在另一字符串中第一次出现的位置。strpos() 函数对大小写敏感。
die('Flag: '.$flag); else echo '骚年,继续努力吧啊~'; }
解析代码:
1、判断是否传入nctf
2、利用ereg函数绕过正则 (ereg函数一个漏洞,类似于0x00截断,都是因为这些函数遇到ASCII码为0的字符时,会自动默认到了结尾而停止)
3、绕过strpos函数
所以第一种方法出来了!
可以使用%00截断的这种
#需要改为%23,url编码问题,不改出不来!

第二种,因为ereg函数对数组只返回null!所以第二种也就出来了!
因为又做了强制判断 === 所以也就是false了
strpos函数也不解析数组,所以也返还null
16、bypass again
看源码:
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.'; }
这题思路点:
1、需要输入a和b
2、a和b不能相等
3、md5值又需要相等,才输出flag!
这题解题点,是这个双等于,都知道双等于可以利用科学计数法绕过,就是0e开头的!所以只要找两个0e开头的md5值就行了,上面有题就是的,就不多说了!
md5('s878926199a')=0e545993274517709034328855841020
md5('s155964671a')=0e342768416822451524974117254469
直接截图吧:

17、变量覆盖
参看所给源码:

考点:
1、extract函数

2、让$pass == $thepassword_123,这就利用到上面的函数extract()
让$pass、$thepassword_123赋值相同值就行了
如下:

18、PHP是世界上最好的语言
做不了!
19、伪装者

由题所知:需要修改本地也就是127.0.0.1,打开burp吧!
要么是X-Forwarded-For代理服务,或者是client-ip真实ip地址!


20、header
这个也做不了!
21、上传绕过

文件上传,还是用burp抓包、改包、发送!
选择比较小点的图片,最好不要超过1M的越小越好!最好是png的,文件内容不容易损坏!

上传发现需要后缀为php的,所以考虑用%00截断试试!
%00截断是文件后缀名就一个%00字节,可以截断某些函数对文件名的判断,在许多语言函数中,处理字符串的函数中0x00被认为是终止符,相当于sql注入中的#!
上传函数处理1.php%00.jpg时,后缀名是合法的jpg、png、gif格式,可以上传,在保存文件时,遇到%00字符,后面的jpg就不要了,文件后缀最终保存的后缀名为1.php

发现回显支持gif、png、jpeg!所以尝试用目录截断!

发现还是不行,应该是截断出现问题了,在去修改一下hex里面的,

文件上传建议去做 upload-labs 百度上都有
靶机下载地址:https://github.com/Tj1ngwe1/upload-labs
22、SQL注入1
点击source查看源码!
<html> <head> Secure Web Login </head> <body> <?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]); //trim() 函数移除字符串两侧的空白字符或其他预定义字符!就是去空格! $pass = md5(trim($_POST[pass])); //被md5加密,所有这个只能在用户做手脚了! $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; //后面的pw用%23给注释,主要构造前面的! echo '</br>'.$sql; $query = mysql_fetch_array(mysql_query($sql)); if($query[user]=="admin") { //只有user等于admin才给flag! echo "<p>Logged in! flag:******************** </p>"; } if($query[user] != "admin") { echo("<p>You are not admin!</p>"); } } echo $query[user]; ?> <form method=post action=index.php> <input type=text name=user value="Username"> <input type=password name=pass value="Password"> <input type=submit> </form> </body> <a href="index.phps">Source</a> </html>
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
首先我们先看这个,看如何绕过,可以自己弄个记事本什么的自己来尝试一下,最好是在命令行中,在mysql中!
$sql="select user from ctf where (user='admin' or 1=1)%23 (后面的都不要了,被注释了)') and (pw='".$pass."')";
看这样就简单的闭合了,所有不要拿到题目就直接上手,先看sql语句,再看过滤机制,代码审计就这样的,看懂代码才是最重要的!直接去看一下行不行!

下面再尝试一下sqlmap跑一下!(使用kali中自带的,本机的卸载了)
因为是post传参,所有用burp抓包一下!

保存为1.txt,再用SQLmap跑!
payload:sqlmap -r 1.txt --dbs

payload:sqlmap -r 1.txt --tables -D sae-chinalover

下面的我也就不跑了,这里面有个是gbksqli的还有的是其他的!自己可以尝试玩玩!

这个是这一题的!
23、pass check
参看所给源码:
$pass=@$_POST['pass']; //post传参 $pass1=***********;//被隐藏起来的密码 if(isset($pass)) //判断是否有pass参数传入 { if(@!strcmp($pass,$pass1)){ //比较两个字符串,也就是让post传进去的参数和pass1进行比较,要让这个成立也就输出flag了! echo "flag:nctf{*}"; }else{ echo "the pass is wrong!"; } }else{ echo "please input pass!"; } ?>
strcmp() 函数比较两个字符串。
注释:strcmp() 函数是二进制安全的,且对大小写敏感。
如果 str1 (第一个字符串)小于 str2(第二个字符串) 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
没思路,去找了strcmp漏洞!终于发现,这个函数,如果传入数组,那他会返回0,
要求传入字符串。如果传入非字符串呢?
结果函数报错!但是函数返回“0” 。 虽然报错了但函数的判断却是“相等”
如何传入非字符串?答案是传入数组
将变量的结尾加上“[ ]” 将其构造为数组。
转载:https://www.cnblogs.com/llww/p/12156524.html
尝试一下:成功!

又学习了!又找到一些图,看这些图我基本没懂,应该我是菜鸡吧!



如果哪位大佬刷到了,可以方便给我留个思路呗,感谢!
24、起个名字真难
参看所给源码:
<?php function noother_says_correct($number) { $one = ord('1'); $nine = ord('9'); for ($i = 0; $i < strlen($number); $i++) //循环传入的number { $digit = ord($number{$i}); //进行循环过后的值 if ( ($digit >= $one) && ($digit <= $nine) ) //如果 $digit>1或者小于9就false! { return false; } } return $number == '54975581388'; } $flag='*******'; if(noother_says_correct($_GET['key'])) //必须输入key=54975581388就输出flag!
echo $flag;
else echo 'access denied'; ?>
要点就是要key=54975581388,输出flag!又被过滤数字,所有这个点我只有用16进制来进行绕过!
网址:https://tool.oschina.net/hexconvert/

提交:(需要加0xccccccccc)因为是16进制!

25、密码重置

点进去发现用户名怎么都改不了的!

所以点击右键,点击检查:
根据题目改为admin

点击重置:flag出来

26、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?"; ?>
进行序列话:(解释我都写再里面了,注释方就是)

进行验证,看看序列话出来的值

最后验证:

知识点:
主要说的是面向对象,涉及到了魔法函数__construct(),和为变量$this,面向对象我博客首页有点知识点,可以自己看一下,不好的地方请指出,感谢!
27、SQL注入2
<html> <head> Secure Web Login II </head> <body> <?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]; //post传参 $pass = md5($_POST[pass]); //md5加密 $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'")); //sql语句! 存储结果集 if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) { //strcasecm比较两个字符串(不区分大小写): echo "<p>Logged in! Key: ntcf{**************} </p>"; } else { echo("<p>Log in failure!</p>"); } } ?> <form method=post action=index.php> <input type=text name=user value="Username"> <input type=password name=pass value="Password"> <input type=submit> </form> </body> <a href="index.phps">Source</a> </html>
如果变量存在,并且,$pass与$query[pw]相等(不区分大小写)
$query[pw]) && (!strcasecmp($pass, $query[pw])
这个成立才输出flag。
这个主要是传进去的user用户里面的密码pass和md5加密的pass比较,所有需要绕过这个md5加密。
先看sql语句:
("select pw from ctf where user='$user'")
直接构造一下payload吧,利用union select联合查询:

pass=1对应的是md5(1)!只要md5()里面的数和pass所等于的对上就可以了
28、综合题2
这个单发,点击:https://www.cnblogs.com/hcrk/articles/12540271.html
29、密码重置2
看题目提示:

根据第一点找到管理员邮箱!

根据第二点vim的备份文件,先了解vim的备份文件!
看一些博客写的感觉太麻烦了,直白的理解就是再编辑vim文件时,或生成一个.xxx.swp的文件。
vim中的swp即swap文件,在编辑文件时产生,它是隐藏文件,如果原文件名是submit,则它的临时文件
就是.submit.swp!
所以这里的临时文件应该时..submit.php.swp

看截图中所框的,需要$token字段等于10,并且都为0!
所以这题出来了,结合上面的管理员邮箱地址!

30、file_get_contents
查看源码,因为一进去发现是空白页面,不是404,说明应该还是有东西的!

看到这个file_get_contents()函数,这个是post传参的,一般会结合伪协议一起使用,例如:file_get_contents("php://input")截取post传进来的参数值!
所以这一题应该就是利用伪协议中的php://input了!

出来了!
31、变量覆盖
还是代码审计题:

主要说的是两个$$符号,因为$$key= $value,当$value = name时, (就是给get传入参数)$$key = name 即$name = meizijiu233!
所以就出来了!

变量覆盖,我们遇到两个了,一个是extract()函数,一个是现在这个双$$符号,还有两个分别为parse_str()函数、import_request_variables()函数,感兴趣可以自己去找找度娘!
结束!下面三题不能做了!所以CG-ctf之web结束,下期做攻防世界里面的!南邮这个算是入门,题目是前面难后面慢慢加大难度,
攻防世界过段时间继续更新!

浙公网安备 33010602011771号