前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql注入高级篇2--sqli lab

mysql注入高级篇2--sqli lab

作者头像
lonelyvaf
发布2018-06-07 14:54:40
1.2K0
发布2018-06-07 14:54:40
举报

sqli lab是一个练习sql注入攻击的很好的靶场,我有一个朋友曾经刷了4遍通关,之后就是个牛逼的sqler了。

github项目地址:

https://github.com/Audi-1/sqli-labs

搭建方法:

1、自己随便搭建个web服务器,比如可以使用wamp这种集成环境包

2、将源代码复制到web服务器网站的根目录文件夹下

3、打开sql-connections文件夹下的“db-creds.inc”文件

4、修改mysql用户名和密码为你自己的

5、打开浏览器,通过localhost的index.html访问文件夹

6、点击setup/resetDB 链接在你的mysql中创造数据库

7、此外,可以在你练习的那个文件的源码中加入一句话: echo"$sql.<br>";可以显示注入时进行的sql语句,方便大家学习

这样我们可以访问http://localhost/sqli-labs/可以看到如下的界面

点击basic challenges就跳到了下面的树状图,总共有四五十关。

我们进入第一关:http://localhost/sqli-labs/Less-1/ 这边提示你输入参数。

我们这里可以用index.php?id=1或者直接传参:http://localhost/sqli-labs/Less-1/?id=1

可以看到我们执行的语句是:select * from …..~~

然后id=2的用户密码分别被打印出来了。

发现这个页面会根据传入的ID查询到对应的用户

这里我们可以通过查看数据库进行验证 :你们可以分别输入id=1、id=2、id=3…验证。

但是我们猜测的这个SQL语句并不一定正确,因为SQL语句在执行的时候 , 对语法有一定的要求 , 但是并不是特别严格 , 例如 :

SELECT username,password FROM `users` WHERE id ='$_GET['id']'; SELECT username,password FROM `users` WHERE id ="$_GET['id']";

这两种都是可以查询到数据的,因此我们如果要攻击这个网站的话 , 就要想办法猜测出这个页面的SQL语句是怎么写的。 要猜测属于上面的哪一种情况 , 这样我们才可以将我们自己精心构造的SQL语句注入到正常的参数里面。 让我们的SQL语句的到执行 , 达到我们的目的(读出本来我们不能读取的内容 , 或者对数据库进行增/删/改/查的操作 , 或者利用数据库软件读取或者写入服务器上的文件 ... ) 我们可以先在本地的MySQL中对SQL语句进行测试 :

那么如果当我们输入的参数id并不是按照程序员想的是一个整数呢 ? 如果我们输入一个字母/一个符号会怎么样 ? You have an error in your SQL syntax; check the manual thatcorresponds to your MySQL server version for the right syntax to use near ''2''LIMIT 0,1' at line 1

但是当使用PHP去操作MySQL的时候 , 因为用户是通过PHP对数据库进行操作 , 所以不可能像我们刚才那样存在一个交互的界面 , 因此就这个单引号就不可能被闭合 , 因此这个时候就会报错 , 也就是刚才我们得到的这个错误 这个时候 , 如果我们继续修改一下查询的id这个参数 这里可以尝试使用MySQL定义的注释关键字

-- # /**/

需要说明一下 , 第一个是两个-连接符后面紧跟着一个空格 前两个注释符是单行注释 , 第三个是多行注释 如果我们在id这个参数后面添加了注释的时候 : SQL语句变成这样 :

代码语言:javascript
复制
SELECT username,passwordFROM`users`WHEREid = '1'-- ' LIMIT 0,1;
代码语言:javascript
复制
SELECT username,passwordFROM`users`WHEREid = '1'#' LIMIT 0,1;

传递参数的语句为:

代码语言:javascript
复制
http://localhost/sqli-labs/Less-1/?id=1%27--+
代码语言:javascript
复制
http://localhost/sqli-labs/Less-1/?id=1%27%23

注意这里我们没有使用到原本的字符'和# 而是将它们URL编码以后再进行参数的传递 , 这里是因为服务器再接收到参数以后会对参数进行一次URL解码 这样的话解码之后刚好就可以拼凑成正常的SQL语句 还有一个需要注意的地方就是 :

  1. 为什么是--+而不是--

这里字符-和字符+在URL中都是有固定的含义的 , 比如说+就在URL编码中就代表空格 , 而URL编码中-不用编码

  1. 为什么--+没有被URL编码

由于这里我们是用+代替了 , 因此不需要进行编码 , 我们也可以不用+ 而使用空格的URL编码 , 那么编码得到的URL就应该是 : http://localhost/sqli-labs/Less-1/?id=1%27--%20

  1. # 又为什么必须得编码 , 不编码可以吗 ?

不可以 , 因为# 在URL中是有固定的含义的 , 表示页面中的锚点 , 如果不进行编码浏览器就会将其当成页面的锚点 , 而这里我们是需要将其作为数据传输给服务器的 , 因此需要进行URL编码

  1. 为什么不用多行注释来注释后面的SQL语句

因为多行注释的格式是 : /*注释内容*/ 在注释内容的前后都需要有标记 而这里我们只能控制SQL语句的一个位置 , 也就是输入id的地方 所以这样我们并不能构成一个正确的多行注释 , 因此不可以 , 大家也可以自己尝试一下 , 会直接报错(语法错误)

好了 , 现在我们尝试访问一下 :

http://localhost/sqli-labs/Less-1/?id=1%27union%20select%201,group_concat(schema_name),2%20from%20information_schema.schemata--+

明天还有,今天懒得排版了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晨星先生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档