好了,说了那么多,总要开始实践了吧!nonono,既然说了是继承涛涛大佬的从零开始sql注入,所以还是得说很多废话,话说前一篇很多都是我懒然后从涛涛大佬哪里复制的2333333

所以,sql注入到底是啥呢?好吧,我承认我骗了你萌,说是从零开始,但是你们也是要有一些sql的基本知识,以及一些php mysqli函数的了解关于sql的知识,出门右转mysql官方文档,要是太深奥,你看不懂(都是借口),可以去菜鸟教程,关于php,可以看官方文档, 或者是菜鸟教程

0X01 理解sql注入

为啥还要理解,话说你看了啥叫sql注入就是理解了?wtf怎么可能???OWASPTOP1的世界级漏洞能这么让你轻易理解吗?上一次,只是一个简单的概念嘛,至于进行sql注入,这些概念还是不够的。

我们打开less-1,改变一下他的id=1,会显示一个用户以及密码,接下来开始搞事情了,先套路一波,传一个id=1',咦,报错了,你会发现是SQL语句中出现了偏差,怎么会出现偏差呢?原来 SELECT * FROM users WHERE id='1'' LIMIT 0,1 中单引号不匹配,如果sql语句没有进行严格的过滤,那么会产生很严重的行为,我们可以操纵指令,控制数据库,甚至危害内网。

0X02sql注入的分类

  • Boolean-based blind SQL injection(布尔型注入)
  • Error-based SQL injection(报错型注入)
  • UNION query SQL injection(可联合查询注入)
  • Stacked queries SQL injection(可多语句查询注入)
  • Time-based blind SQL injection(基于时间延迟注入)

关于注入点的分类

  • 字符型注入点
  • 数字型注入点
  • 搜索型注入点

0X03那我们就开始吧

首先需要判断一个sql注入的注入点以及注入方法

打开Less-1我们可以看到需要传入id作为参数,于是,我们传入id=2-1 发现报错,于是可以猜测不是数字型,我们打开Less-2我们可以看到传入id=2-1会传回id=1的信息,那么这就可能是数字型的.

接下来你肯定会喜滋滋的尝试1+1了,so,我们试一试:http://127.0.0.1/sqli-labs/Less-2/?id=1+1

纳尼,怎么报错了!是的,他并没有计算 1+1 的值,而是直接报错了。这是为什么呢?因为+会被 SQL 解析成空格,于是原有的 SQL 语句就被破坏了。那么怎么样才能让他进行加法运算呢,那就是 URL 编码,我们尝试传递参数id=1%2b1,你会发现成功的显示了第二条记录的值。这个%2b就是加号的 URL 编码,这样就会计算 1+1 了。

(ps:我们开个脑洞,运算符符号真的只有加减乘除么,逻辑运算的符号也算哦~) 这样一来我们就有了很多种判断这里是否有注入点的方法。其实在讲到单引号的时候,你应该马上就想到双引号,括号啊什么的配对括号。对于数字型的,只要传入一个非数字类型的参数就会引发错误了。 只有这些还是不够的,还有另一种方法,就是构造 True and False 条件。我们先来测试几个 payload 吧。

http://127.0.0.1/sqli-labs/Less-2/?id=1 and 1=1
http://127.0.0.1/sqli-labs/Less-2/?id=1 and 1=2

尝试一下上面的两个,发现了什么,第一个返回了正常的数据,第二个返回异常,这又是为什么呢。老方法,我们把传入的参数代入 SQL 语句中看一下是什么样子。

SELECT * FROM table WHERE id = 1 and 1=1
SELECT * FROM table WHERE id = 1 and 1=2

结果一目了然,第一条因为AND两边有一个1=1构成了永真条件,所以会返回正确的数据。第二条语句因为AND两边有1=2导致了WHERE子句永假 (不明白的话想想AND的逻辑),所以不会返回正常的结果了。

通过这种方法也可以判断是否有注入点。

继续开脑洞,只有 AND 可以这么判断么,结合上前面的符号问题呢?更多的猥琐技巧可以看这里:http://lightless.me/archives/SQL-Injection-weisuo-Skill.html

通过上面的方法我们大概可以得到一些奇怪的姿势来判断数字型注入,接下来我们回到Less-1,来看看字符型注入点是怎么被找到的

既然1'已经试过了,那么我们就不再试了,这样,我们来复现一下sql语句

SELECT * FROM table WHERE id = '$id'

所以说,我们来试一下1' and '1' = '1,构造一个永真条件如果觉得复杂,可以用#来注释掉后面即 1 'and 1#注意,你在get提交时需要进行url编码

有时候单引号也并不好用关键是你的经验和脸(23333怕被打)

emmmm,这节差不多就是这样咯,下一节我们来搞一点轻松地事情咯