​Sqli - labs实战笔记

​Sqli - labs 安装与lesson1-4实战

所需环境:

1. PHP
2. MYSQL
3. Apache/Nginx

以上三项Debian都自带了,2与3直接开启即可,但是有几点要注意:

1. Debian下的MySql每次登录的时候默认需要授权,即必须使用sudo,可以修改配置文件忽略默认授权,修改方法在之前的文件有提起过.
2. Apache存放文件放在/var/www/html/目录下
3. sqli - labs 使用的PHP5编写的,但是Debian默认安装PHP7,兼容性太差,需要手动删除PHP7然后安装PHP5,安装方法前面的文章(Debian笔记)也提起过,这里不做复述.

下载安装

切换到 /var/www/html/ 目录下,使用命令:

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

下载好后,在sql-connections文件夹下的“db-creds.inc”文件
修改mysql用户名和密码为你自己的密码,数据库地址记得填写127.0.0.1,这一点在之前的文章也说过.

浏览器打开

http://127.0.0.1/sqli-labs/

为了方便下载,已经保存到当前服务器下

下载地址:http://www.langzi.fun/upload/sqli.rar

如果是WIN下的平台,使用PHPStudy搭建环境即可

Sqli Labs Lesson 1 实战笔记

这是我总结的注入大致流程,常规的注入按照此流程进行能有个头绪

 

之所以先讲 1-4 章节是因为这四课都是非常基础的注入,完全可以归纳在一个知识点上.若不熟悉可以先温习前面的基础知识:MYSQL基础知识点:http://www.langzi.fun/categories/SQL-%E6%B3%A8%E5%85%A5%E6%94%BB%E5%87%BB/

判断是否存在注入

加上单引号发现报错了,判断为字符型注入.

判断字段数

输入4的时候报错,3正常,说明存在3个字段

判断可显示字段

可以看到2,3的位置可以插入查询,下面来探测一些数据看看.

探测信息

可以看到当前的数据库,用户

探测表名

可以看到探测出来三个表,按照习惯猜测,users这个表存储的应该是用户名账号密码等信息,那么继续探测这个表有哪些字段内容.

探测列名

根据回显,确认username,password字段就是需要的,接下来查询他们的字段内容即可.

探测数据

得到所需信息,注入结束.

Lesson 2-4 实战

之所以1-4放在一起讲是因为注入方式一样的,只是稍微区别了一下数字型与字符串型,数字型不需要闭合,直接order by判断字段后面都一样,字符串型的需要闭合,举个例子:

lesson 1 :?id=1 ' union xxx --+ 
lesson 2 :?id=-1 union xxx --+ 
lseeon 3 :?id=-1') union xxx --+
lseeon 4 :?id=-1") union xxx --+ 

总结下:

1. 判断存在注入后,再判断是字符型还是数字型,字符型就要闭合一下
2. 像lesson1-4的注入内容直接在客户端显示了,使用上面的套路流程走一波
3. 最后面可以注释掉,也可以选择去闭合后面的,但是有些麻烦
4. 如果是数字型注入,可以使用INT溢出代替空格,即:?id=1e66union xx等同于?id=6 union xx

关于Lesson 1-4 暂时就告一段落,后面的实战练习涉及知识点才是真正常用的,比如盲注,显错注入等等,需要的知识点累计也越来越多,这是好事,关于绕过WAF注入其实就那么一些套路,什么加密混淆反复调用大小写编码之类的,往后专门出一篇文章就练习绕过WAF注入.

 

知识点补充

第五课与前面四课不一样,前面可以通过回显内容直接查询到结果,但是第五课中尝试注入不管输入什么都只会给你提示一个正确页面和错误页面,在此之前除了要掌握前面两篇文章中提起的SQL盲注基础知识 与SQL注入基础 的所有函数都必须要会.

在此之后还涉及到一个新的知识点,强制让页面报错.

SQL盲注基础知识:http://www.langzi.fun/Sql注入之盲注笔记.html

SQL注入基础:http://www.langzi.fun/SQL注入基础笔记.html

 

查询数据库数量

强制报错回显

如果你在数据库中测试内容回显都是null,说明你没有选择数据库,在此之前记得use security

可以看到根据回显内容判断数据库有5个,当前数据库为security,但是回显的内容太多重复,这个时候使用group by 让那些属性一样的值只显示一个

select concat(database(),':',floor(rand()*2)) as a from information_schema.schemata group by a;

当然这里不限于在infomation_schema.shcemata(数据库表)中查询,你还可以在information_schema.tables(所有表)中查询.

查询是否有记录

这里有点拗口,关于select 1 from tables这个知识点,我在网上了解到是判断条件是否存在.

1、select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。

2、查看记录条数可以用select count(1) from mytable;等价于select count(*) from mytable;

select * from organization where 1=1 and exists(select 1 from organization where orgid >1999999)

我个人的理解是,select 1 from tables的作用是判断这个tables中是否存在查询的字段数据,如果有页面就返回真.

构造公式

上面说的有点迷糊,其实总结下来就那么一套公式,遇到该种注入方式直接套公式即可,但是弄清楚原理还是很有必要的,大家多敲下语句加深印象对以后手工注入还是有很大的帮助的.

?id=1'and (select 1 from (select count(*),concat(database(),':',floor(rand()*2)) as a from information_schema.tables group by a)as b limit 0,1)--+

这里把database(),换成user(),@@datadir,就能探测到别的信息.

来分析一下这个公式

1. select count(*),concat(database(),":",floor(rand()*2))as a from information_schema.tables;

在数据库的所有表中搜索,搜索所有的表的数量,以及当前数据库名字,用冒号拼接后面的函数,后面的函数作用是在0-1中随机选择一个数字然后乘以2,当然你在数据库查询的时候把floor(rand()*2)改写成6666666也是可以的,但是在浏览器中就不行.

2. 然后把上面查询到结果使用group by排序一下,如果没有group by的话不会回显内容

3. 最后查询到的结果赋值位b,限制输出一个数值,这里测试不加limit 0,1也可以

脑壳疼,下面直接来实战一下吧!

Sqli Labs Lesson 5 实战笔记

判断是否存在注入

加上单引号发现报错了,判断为字符型注入.

判断字段数

输入4的时候报错,3正常,说明存在3个字段

判断可显示字段

这个时候使用老套路:

?id=-1' union select 1,2,3 --+

发现和想象中的不一样,并没有显示那个位置可以回显信息

不慌,咱来把公式套上去

探测信息

可以看到把数据库名爆出来了,这里你可以把公式中的database()替换成user()等去探测别的信息,并且通过强制报错可以不用去探测字段数,发现没有?

探测表名

探测表名和以前一样啊,直接查询所有的表,但因为公式的限制一次只能回显一个,注意这里别忘了limit限制输出,继续查询下一个表名用limit 1,1 再后面的就是limit 2,1 。按照习惯猜测,users这个表存储的应该是用户名账号密码等信息,那么继续探测这个表有哪些字段内容.

探测列名

探测方法如上,根据回显,确认username,password字段就是需要的,接下来查询他们的字段内容即可.

探测数据

探测数据的方法和上面一样,同样一次只能查询一个,查询两个使用concat连接在一起。
得到所需信息,注入结束.

Lesson 6

注入方式与5一致,只是闭合方法不一样

lesson 6 :?id=1" and (select xxxx)--+

报错思路拓展

1、通过floor报错,注入语句如下:

and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a);

2、通过ExtractValue报错,注入语句如下:

and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

3、通过UpdateXml报错,注入语句如下:

and 1=(updatexml(1,concat(0x3a,(selectuser())),1))

4、通过NAME_CONST报错,注入语句如下:

and exists(select*from (select*from(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)

5、通过join报错,注入语句如下:

select * from(select * from mysql.user ajoin mysql.user b)c;

6、通过exp报错,注入语句如下:

and exp(~(select * from (select user () ) a) );

7、通过GeometryCollection()报错,注入语句如下:

and GeometryCollection(()select *from(select user () )a)b );

8、通过polygon ()报错,注入语句如下:

and polygon (()select * from(select user ())a)b );

9、通过mult

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子燕青啦啦啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值