21、Header
打开链接后显示“什么也没有”
查看源代码:
无可用信息,故转换思路,使用burpsuite抓包来进行分析:
抓到的包:
发送到repeater模块:
单击GO进行查看Response相应:
题目考察点: 思路转换绝处逢生!
22、上传绕过
打开链接:
查看源代码:
结合题目名可知这是一个文件上传绕过试题
我们结合提示:“猜猜代码是怎么写的”可知它可能对文件的格式(JPEG、JPG、PHP、ASP、jsp等)、文件大小等内容有限制
我们先试试上传一个图片格式的文件看看:
那么之后上传一个PHP文件看看:
通过上面的测试,可以知晓题目要求上传一个图片格式+PHP格式的文件,此时我们可以联系到/00截断来实现,具体操作如下:
上传一个PHP文件,并抓包:
之后改包
采用00截断
之后返回查看截断效果:
释放包并查看浏览器所提供的页面:
题目考察点: 00截断的使用
23、SQL注入1
打开链接
查看sources:
代码含义解释:通过post提交方式 user与pass,而且提交的user必须是admin.但是密码不知道。所以就得在$sql=这句想办法绕过and (pw='".$pass."') 这段 ,所以构造的语句就是这样语句:
Username=admin ‘)# 之后提交可得:
题目考察点: 代码审计 sql注入语句的构造
24、Pass check
源码:
<?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()函数来比较pass和pass1的值是否相等。但是strcmp()同样存在漏洞。关于strcmp的漏洞网上有很多,这里截取了网上的一段分析:
strcmp() 函数比较两个字符串。该函数返回值情况如下所示:
0 如果两个字符串相等;
<0 如果string1小于string2
>0 如果 string1 大于string2
注意:这里的strcmp函数实际上是将两个变量转换成ascii 然后做数学减法,返回一个int的差值。
也就是说键入两个相同的字符串进行比较得到的结果就是0!
但是有一种特殊情况就是让数组和字符串比较,此时PHP会返回NULL!
那么这道题目就可以将pass以一个数组的方式传入。
25、起名字真难
源代码:
<?php
function noother_says_correct($number)
{
$one = ord('1'); 将1装换为其对应的asicc值并且将值赋给$one
$nine = ord('9'); 将9转换为其对应的asicc值并且将值赋给$nine
for ($i = 0; $i < strlen($number); $i++)
{
$digit = ord($number{$i}); 依次将变量$number中的字符装换为对应的asicc值
if ( ($digit >= $one) && ($digit <= $nine) ) 如果变量$digit的asicc值介于1和9的asicc值之间则返回false,否则继续
{
return false;
}
}
return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
echo $flag; 获取flag的关键在于if的条件判断语句要为真
else
echo 'access denied';
?>
为了验证成功获得flag我们可以传入16进制数值,访问的URL为:
http://chinalover.sinaapp.com/web12/index.php?key=0xccccccccc
之后查看原网页:
题目考察点:代码审计
26、密码重置
打开链接:
查看源代码:
无可用信息,我们原回到提交页面,并且提交一个新密码,并且抓包试试:
此时我们转到Params下:
之后我们可以看到URL是经过base64加密的,而且联想到密码的最高使用权限就是系统的管理员admin,所以我们采用admin试试:
对Admin———base64加密:之后修改URL、user、password:
之后转到Raw块:
之后释放包之后再查看原网页:
题目考察点:惯性思维推理
27、PHP反序列化
网页无法访问,故跳过!
28、sql injection 4
题目提示:
打开链接:
查看源代码:
提交方式为get提交方式,采用了过滤手段将提交的用户名与密码中的所有的单引号、双引号进行了过滤操作,所以可以使用\来让’来闭合,构造语句如下:
以上构造语句带入数据库查询的语句相当于:
SELECT * FROM users WHERE name='\' AND pass=' or 1= 1#';
29、综合题
打开链接:
之后这接在控制台跑一次:
加后缀之后访问一下:
发现之后找不到内容,之后回到起点,注意点提示“bash”百度了一下相关,最终查出/.bash_history这个是用来存放历史记录的,这时候尝试访问
得到
zip -r flagbak.zip ./*
直接访问flagbak.zip
会得到一个下载压缩包,下载即得flag
30、sql注入 2
打开链接:
查看源代码:
strcasecmp是不分大小比较,这样只要得到密码md5值相同即可,提示已经说了用union,我们就可以构造最简单的payload :
username:username' union select md5(1)#
password:1
说明:
最前面的单引号是为了闭合原文中的where user=‘ And 0=1 是为了使前面的表达式返回值为空从而使得从而使select pw from php where user='' AND 0=1这句话完全没用
接着我们使用UNION SELECT "c4ca4238a0b923820dcc509a6f75849b",直接把MD5值作为返回值retuen给$sql,这样在查询的时候$query就会有值。c4ca4238a0b923820dcc509a6f75849b这串MD5值是数字1经过MD5 hash之后的结果,可以直接用MD5(1)代替最后的#用来注释掉后面没用的东西最终,将'AND 0=1 UNION SELECT
"c4ca4238a0b923820dcc509a6f75849b" #附加输入到user框里,将数字1输入到pass框里,登录成功。
31、综合题 2
这个题目笔者想了只是看到了一些可以使用的信息,但是最后也没有搞出来,这些信息有:
通过替换file之后的文件名可以获取到不少的信息量!
有兴趣的人可以继续深入研究!