南邮攻防平台学习笔记(web篇)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cherrie007/article/details/77963776

1、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";}
?>

首先来就题论题,题目要求get请求为参数a传参,并且参数值不等于QNKCDZO,但是两者的md5值要相同。这是由于php弱类型导致的bug,百度上有这些:

var_dump(md5('240610708') == md5('QNKCDZO'));
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));
var_dump('0010e2' == '1e3');
var_dump('0x1234Ab' == '1193131');
var_dump('0xABCdef' == ' 0xABCdef');
bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) 

都是ture。这道题的话直接给a传入240610708就可以得到flag了。

—————–不华丽的分割线—————-

为什么上面的式子成立呢?

php在处理hash字符串的时候会用到!=,==来进行hash比较,如果hash值以0e开头,后边都是*数字*,再与数字比较,就会被解释成0*10^n还是为0,就会被判断相等。上面的hash值都是0xe(数字)。

var_dump("0e1234abc"=="0") 0e后面不是数字了就判断为false

要是换成”===”呢?

都为false。由于php是弱类型语言,相等(==)只判断两者的值是否相等,并且在比较前将其类型转换为一致再进行比较;

而全等(===)是判断类型和值,当两者的类型和值都相等值才为true。

我们可以探测一下后台密码保存的方式,把你的密码设成 0x1234Ab,然后退出登录再登录,换密码 1193131 登录,如果登录成功,那么密码绝对是明文保存的;同理,密码设置为 240610708,换密码 QNKCDZO 登录能成功,那么密码没加盐直接md5保存的。

最后,密码比较的时候要用hash_equls()比较。((PHP 5 >= 5.6.0, PHP 7))

2、文件包含

访问连接这就是一个典型的文件包含的漏洞
遇到了这样的文件包含漏洞,就可以使用filter的方式读取php的源代码了。用法如下:

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

查看手册可以看到php有许多协议
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流

此题涉及的是php://(访问各个输入输出流的协议)

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

名称 描述
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(
<;两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

——–分割线———

from:http://www.cnseay.com/2356/comment-page-1/

php.net中两个基本的例子:

<?php
/* 这会以大写字母输出 www.example.com 的全部内容 */


readfile(“php://filter/read=string.toupper/resource=http://www.example.com”);



<?php
/* 这会通过 rot13 过滤器筛选出字符 “Hello World”
  然后写入当前目录下的 example.txt */


file_put_contents(“php://filter/write=string.rot13/resource=example.txt”,”Hello World”);


在这个例子中,php会先把Hello World字符串做string.rot13转换然后再写入文件,这在场景A中会有用到。

2、利用场景

A.在黑哥(膜拜黑哥)的关于[技术挑战-2]有提到,这里只说和php://filter有关的部分。

下面一段代码:

<?php
$str = ‘<?php exit(\’74\’);?>’.$_GET[‘c’];
$fname = $_GET[‘f’];
file_put_contents($fname,$str);

如何成功将phpinfo();写入文件并执行?利用上面提到的基础知识可以提交如下链接:

http://127.0.0.1:81/test.php?f=php%3A%2f%2ffilter%2fwrite%3Dconvert.base64-decode%2fresource%3Dwebshell.php&c=dddPD9waHBpbmZvKCk7Pz4

值得注意的有两点:

1). base64_decode()会忽略要解码字符串中无效字符像<>?;等,这里给出base64_decode()函数忽略无效字符相应的c函数代码

   ch = base64_reverse_table[ch];
    if ((!strict && ch < 0) || ch == -1) { /* a space or some other separator character, we simply skipo    ver */                    continue;
    } else if (ch == -2) {
         efree(result);
         return NULL;
    }

2). 将

<?php 
include($_GET[‘file’]);

你想查看和本代码同一目录下config.php的内容。如何查看呢

http://127.0.0.1:81/test.php?file=php://filter/convert.base64-encode/resource=config.php

php://input的知识

3、sql3

mysql自带的一个存储了所有数据库信息的数据库information_schema

4、ereg()漏洞
ereg()在读到%00就不再往下读了
更多php常见漏洞

不过,手册告诉我们:

This function was DEPRECATED in PHP 5.3.0, and REMOVED in PHP 7.0.0.

Alternatives to this function include:

preg_match()

5、bypass again

也是php弱类型导致的漏洞
md5()函数本来只能接收String类型的参数的,如果接收一个数组类型则值为null。
md5()函数也不提倡来保存用户的密码,
关于密码散列的知识

6、pass check

php strcmp()函数的漏洞

在官方的文档有这么一端说明:

Note a difference between 5.2 and 5.3 versions

echo (int)strcmp('pending',array());
will output -1 in PHP 5.2.16 (probably in all versions prior 5.3)
but will output 0 in PHP 5.3.3

Of course, you never need to use array as a parameter in string comparisions.

大概意思就是5.3的之前和之后版本在使用strcmp比较数组和字符串时候的差异。在5.3的版本之后使用这个函数比较会返回0。

手册strcmp

7、综合题

考查linux下历史查看的命令

history命令:

history 快速找到之前出现过的命令;

history N 显示最近的N条命令;

history -d N 删除第N条命令,N为前面的编号数;

history -c 清空历史命令;

注:清除history之后,.bash_history里仍会有历史记录,如何不让系统记录历史命令:
export HISTSIZE=0

history -a 将当前会话中的命令历史写入指定文件;

history | grep -i “xxx” 模糊查询

那什么是指定文件呢?
就是历史记录的环境变量信息,它通常会保存在用户家目录下的.bash_history。

vim .bash_history查看内容

echo $HISTFILE 使用此命令查看环境变量

echo $HISTFILESIZE 查看最大保存数目

改变环境变量

export HISTCONTROL=ignoreboth

Don’t save duplicates

export HISTSIZE=10000

*这个是针对history命令的设置,The number of commands to remember in the command history. The default value is 500
*
export HISTFILESIZE=10000

这个是针对history文件(.bash_history)的设置,The maximum number of lines contained in the history file. When this variable is assigned a value, the his-tory file is truncated, if necessary, by removing the oldest entries, to contain no more than that number of lines. The default value is 500. The history file is also truncated to this size after writing it when an interactive shell exits.

export HISTIGNORE=’ls’

*A colon-separated list of patterns used to decide which command lines should be saved on the history list.Each pattern is anchored at the beginning of the line and must match the complete line
*
以上的关于history的说明都可以使用man bash查的到,如果想要让你的配置永久生效,可以把export命令写到.bash_profile或者全局配置文件/etc/profile里

8、密码重置

vim下的备份文件,一般情况下备份文件一般都是myfile.txt~或者是.myfile.txt.swp

(这只是个人做题过程中的一些笔记心得,欢迎批评指正)

阅读更多
换一批

没有更多推荐了,返回首页