CG CTF web
本文最后更新于 2220 天前,其中的信息可能已经有所发展或是发生改变。

PHP弱类型比较

1.在PHP中, 0ed+ 类型的数字,==会认为该值为1(我猜是PHP把它看做是0的幂吧)。以下是几个弱类型匹配项:

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');

2. 在PHP中,==会认为 字符串型数字和整数型数字等价的,因此返回1。这也是为什么有 === 的原因了吧。

<?php

‭54975581388‬==‭0xCCCCCCCCC‬ //True
//此时的0xCCCCCCCCC又可看做是字符串
?>

PHP函数漏洞

include 函数漏洞(LFI):

PHP文件包含漏洞的产生原因是在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

通过观察url来猜测文件包含(include)形式,可像下列这样来读取本地文件(是不是SSRF?)

index.php?pages=php://filter/read=convert.base64-encode/resource=config

index.php?file=php://filter/read=convert.base64-encode/resource=index.php
//这样读取的文件显示的是Base64编码后的字符

LFI可以:

目录遍历:
index.php?file=../../../../../../../../../var/lib/locate.db 
index.php?file=../../../../../../../../../var/lib/mlocate/mlocate.db

(linux中这两个文件储存着所有文件的路径,需要root权限)

获取web目录或者其他配置文件:

index.php?file=../../../../../../../../../usr/local/apache2/conf/httpd.conf

如果拥有root权限还可以试试读这些东西

/root/.ssh/authorized_keys

/root/.ssh/id_rsa

/root/.ssh/id_rsa.keystore

/root/.ssh/id_rsa.pub

/root/.ssh/known_hosts

/etc/shadow

/root/.bash_history

/root/.mysql_history

/proc/self/fd/fd[0-9]* (文件标识符)

/proc/mounts

/proc/config.

 

更多见:http://wps2015.org/drops/drops/PHP%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E%E6%80%BB%E7%BB%93.html

 

extract()函数漏洞—-变量覆盖:

extract():从数组中将变量导入到当前的符号表(数组)。若有extract($_POST)

则可以通过提交一个原来已定义的变量相同的文件名,就可以实现变量覆盖。

 

strcmp()漏洞—-数组替代字符串:

适用于5.3之前版本的php。

strcmp(string $str1 , string $str2 )

它的作用是比较两个字符串(长度??)。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。

但是,当像这个函数传入一个数组时,PHP会报错同时返回0!即逻辑上认为两个参数相等。

当出现 :

if (strcmp($_POST['password'], $password) == 0)

就可以POST一个数组来绕过验证。(其实题目已经有一个很明显的提示了)

strpos()

strpos(string $str1 , string $str2)

它也有传入一个数组返回0的问题。(有可能这些字符串比较都有这个问题?)

正则匹配漏洞:

ereg():

这个函数存在 空字节  /0  %00  截断的问题

ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE

当password变量包含空字节时,ereg()函数就会停止匹配,然后做出判断。

preg_match():

这个函数虽然解决了空字节00截断的问题

preg_match('/Merry.*Christmas/is',$greeting);

但是当待匹配的参数超过了 函数的回溯长度 限制,preg_match() 就会返回 False。可以通过发送超长的字符串来绕过验证,另外,还可以在未限定字符首尾的情况下,绕过验证。

 

 

通过HTTP头伪造来源IP

X-forwarded-for:127.0.0.1
Client-IP:127.0.0.1

Linux基础知识

在“~/.bash_history”(“~/”表示用户目录)文件中保存了500条使用过的命令
即用 history 命令查看的东西

vi在编辑时会同时生成一个备份文件 ./<filename>.swp     当正常退出vi时,vi会删除这个文件。

Tips

1.burpsuite 发POST包不对劲,也可以用Firefox的Hackbar插件。

2.在用get方式提交参数时,试试将标点,参数值都 encode URL 试试!

3.上传题可尝试改请求头上传目录,尝试大写,双写

上一篇
下一篇