CTF练习2

2018.7.20

PHP类

CTF练习2_第1张图片
题目链接打开以后,查看源代码,得到有用代码:

?php
if (isset($_GET['name']) and isset($_GET['password'])) {
    if ($_GET['name'] == $_GET['password'])
        echo '

Your password can not be your name!

'
; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else echo '

Invalid password.

'
; } else{ echo '

Login first!

'
; ?>

PHP的isset()函数 一般用来检测变量是否设置
若变量不存在则返回 FALSE
若变量存在且其值为NULL,也返回 FALSE
若变量存在且值不为NULL,则返回 TURE
同时检查多个变量时,每个单项都符合上一条要求时才返回 TRUE,否则结果为 FALSE
版本:PHP 3, PHP 4, PHP 5
PHP函数isset()只能用于变量,传递任何其它参数都将造成解析错误。
检测常量是否已设置可使用 defined() 函数。
sha1() 函数计算字符串的 SHA-1 散列。
sha1() 函数使用美国 Secure Hash 算法 1。
分析代码逻辑,发现GET了两个字段name和password,获得flag要求的条件是:name != password & sha1(name) == sha1(password),其实可以利用sha1()函数的漏洞来绕过。如果把这两个字段构造为数组,如:?name[]=a&password[]=b,这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag.经验证md5()函数同样存在此漏洞。

密码爆破

CTF练习2_第2张图片
抓包后会看到username=admin&pwd=2345&vcode=D2HK&submit=submit
我们可以通过删除验证码来绕过验证码,删除后就是
username=admin&pwd=2345&vcode=&submit=submit
然后在进行正常的密码爆破,就可得到flag

加密

1.md5加密 代码分析

 $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语言的弱类型特性。
$md51 = md5(‘QNKCDZO’)=0E830400451993494058024219903391

  • php发现密文为0e开头,PHP在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。
  • 因为0exx都等于0,所以让两者相等我们只需再找到一个MD5加密后开头为0e的字符串即可

0e开头MD5值小结
(http://www.mamicode.com/info-detail-1719711.html)
所以我们可以令a=s878926199a,在网址后加上index.php?

2.你知道base加密吗
这里写图片描述
可以先进行抓包,有时候还要注意一些奇怪的代码
CTF练习2_第3张图片
把这个代码输入框内提交查询后可得到flag
3.base解密加爆破
CTF练习2_第4张图片
查看源代码,把页面拉到最下面,得到password.txt
把原来地址栏中的http://39.107.92.230/web/web5/index.php改为http://39.107.92.230/web/web5/password.txt后得到密码字典
把这些字典复制在桌面上建立文本,然后对题目进行爆破
CTF练习2_第5张图片
在这一步中load刚才得到的字典文本,最后得到MjkwYmNhNzBjN2RhZTkzZGI2NjQ0ZmEwMGI5ZDgzYjkucGhw
再进行base解密,得到290bca70c7dae93db6644fa00b9d83b9.php
再用它改变地址栏上的网址,得到另一个网页,会提示你还没有登录,不能留言!所以先进行抓包,将Cookie: IsLogin=0改为Cookie: IsLogin=1,&userlevel=guest改为&userlevel=root,forward后网页会提示恭喜,成功了!,这时再进行一次抓包,得到flag%7BC0ngratulati0n%7D,将它进行url解码,得到flag:flag{C0ngratulati0n}
4.上传成功也不一定得到flag哦!!
CTF练习2_第6张图片
这里上传jpg格式的文件后,没有出现flag,说明文件格式不能是jpg,但还要通过网页要求,查看源码
CTF练习2_第7张图片
可以知道上传文件以点分割,第一个点后的如果是jpg就通过
所以我们可以抓包,将后缀改为.jpg.txt

Robots

CTF练习2_第8张图片
robots.txt是一个纯文本文件,是爬虫抓取网站的时候要查看的第一个文件,一般位于网站的根目录下。当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围.
所以我们可以把地址栏中的地址http://www.wechall.net/challenge/training/www/robots/index.php变为http://www.wechall.net/robots.txt试试
可以得到
User-agent: *
Disallow: /challenge/training/www/robots/T0PS3CR3T
User-agent: Yandex
Disallow: *
因为flag格式为{文件名},所以flag:{T0PS3CR3T}

php中===与==区别

===比较两个变量的值和类型;==比较两个变量的值,不比较数据类型。
比如

 $a = '123';

$b = 123;

$a === $b为假;

$a == $b为真;

有些情况下不能使用==,可以使用===,比如:


$a = 'abc';
$b= 'a';
if(strpos($a,$b) === false){
    echo '字符串不包含';
}else{
    echo '字符串包含';
}
?>

如果使用==,则输出“字符串不包含”,这与实际不符。

你可能感兴趣的:(CTF练习2)