PHP Taint - 一个用来检测XSS/SQL/Shell注入漏洞的扩展。从PHP语言层面去分析,找出一些可能的注入漏洞代码。
下面会演示如何安装。由于php的版本升级较快,现在已经升级到8.0的版本。PHP taint在7.3的情况下可以顺利的安装和运行。
php扩展下载
首先,我们来到php taint的下载地址,下载最新版本的taint。
https://pecl.php.net/package/taint
https://pecl.php.net/get/taint-2.1.0.tgz
系统沿用
我们找一个pikachu的靶场来做taint的改造。首先,我们先启动一个pikachu。来到/app的网站目录。
root@ubuntu:~# docker run -itd —name “taint” -p 80:80 -p 3306:3306 area39/pikachu af7d758177a205b7e38431f9051f3c54e18c0cbc3ee57f3edcd7979b0ca12891
root@ubuntu:~# docker exec -it af7 /bin/bash root@af7d758177a2:/#
丢一个phpinfo();的文件在/app的目录里,让我们可以在外面可以访问到。
外部看到的效果。
下载,并解压,然后进入目录:
wget https://pecl.php.net/get/taint-2.1.0.tgz
tar -xzvf taint-2.1.0.tgz
cd taint-2.1.0
phpize
先用phpize编译该模块目录,如果成功,我们就可以用场配置,编译等命令。
但此时此刻,我们会发现我们的系统里么有phpize这个命令。所以,我们下一个开发版来看下。
apt install php7.3-dev
提升错误,安不上去。(核心安装方法,现场指导。:))
直接版本降级后再安装。
apt install php7.3-dev
编译taint并配置
进入到taint的目录,然后进行编译。
./configure
make &&make install
配置PHP,使之加载taint。
由于之前我们对phpinfo的信息的了解,我们知道:
extension_dir 的位置就是对的。
cp zip.ini taint.ini
对taint.ini进行修改如下:
phpenmod taint 使之生效。
打开php.ini,设置下面的内容:
[taint] extension=taint.so taint.enable=1 taint.error_level=E_WARNING
重启apache服务。
/etc/init.d/apache2 restart
打开phpinfo页面看看效果:
注意
测试的时候,记得遇到打开:
###附录
A. 验证的字符串
所有来自GET,GET,_POST, $_COOKIE的变量, 都被认为是Tainted String
B. taint检测的函数/语句列表, 当这些函数使用tainted string参数的时候, taint会给出警告:
- 输出函数/语句系列
echo
print
printf
file_put_contents - 文件系统函数
fopen
opendir
basename
dirname
file
pathinfo - 数据库系列函数/方法
mysql_query
mysqli_query
sqlite_query
sqlite_single_query
oci_parse
Mysqli::query
SqliteDataBase::query
SqliteDataBase::SingleQuery
PDO::query
PDO::prepare - 命令行系列
system
exec
proc_open
passthru
shell_exec - 语法结构
eval
include(_once)
require(_once)
C. 消除tainted信息的函数, 调用这些函数以后, tainted string就会变成合法的string:
escapeshellcmd
htmlspecialchars
escapeshellcmd
addcslashes
addslashes
mysqli_escape_string
mysql_real_escape_string
mysql_escape_string
sqlite_escape_string
PDO::quote
Mysqli::escape_string
Mysql::real_escape_string
D. 调用中保持tainted信息的函数/语句, 调用这些函数/语句时, 如果输入是tainted string, 则输出也为tainted string:
=
.
“{$var}
.=
strval
explode
implode
sprintf
vsprintf
trim
rtrim
ltrim