Sqli-labs学习
sqli-labs
前言
https://github.com/Audi-1/sqli-labs
第一部分(page-1 Basic Challenges)
Background-1 基础知识
注入的分类
基于从服务器接收到的响应
- 基于错误的SQL注入
- 联合查询注入
- 堆查询注入
- 盲注(布尔盲注、时间盲注、报错盲注)
基于如何处理输入的SQL查询(数据类型)
- 基于字符串
- 数字或整数为基础的
基于程度和顺序的注入(哪里发生了影响)
一阶注入
二阶注入
一阶注射是指输入的注射语句对 WEB 直接产生了影响,出现了结果;二阶注入类似存 储型 XSS,是指输入提交的语句,无法直接对 WEB 应用程序产生影响,通过其它的辅助间 接的对 WEB 产生危害,这样的就被称为是二阶注入.
基于注入点的位置上
- 通过用户输入的表单域的注射
- 通过cookie注射
- 通过服务器变量注射(基于头部信息的注射)
系统函数
- version() –MySQL版本
- user() –数据库用户名
- database() –数据库名
- @@datadir –数据库路径
- @@version_compile_os –操作系统版本
字符串连接函数
函数具体介绍 http://www.cnblogs.com/lcamry/p/5715634.html
- concat(str1, str2, …) – 没有分隔符的连接字符串
- concat_ws(separator, str1, str2, …) – 有分隔符的连接字符串
- group_concat(str1, str2, …) – 连接一个组的所有字符串,并以逗号分隔每一条数据
一般用于尝试的语句
ps:
--+
可以用#
替换, url提交过程中url编码后的#
为%23
1
2
3
4
5
6
7or 1=1 --+
' or 1=1 --+
" or 1=1 --+
) or 1=1 --+
') or 1=1 --+
") or 1=1 --+
")) or 1=1 --+一般的代码为:
1
2$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";此处考虑两个点,一个是闭合前面你的
'
,另一个是处理后面的'
,一般采用两种思路,闭合后面的引号或者注释掉,注释掉采用–+ 或者 #(%23)union操作符的介绍
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的 列的顺序必须相同。
1
select column_name(s) from table_name1 union select column_name(s) from table_name2
默认地,
UNION
操作符选取不同的值。如果允许重复的值,请使用UNION ALL
。1
select column_name(s) from table_name1 union all select column_name(s) from table_name2
UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名
SQL中的逻辑运算
注入流程
Mysql 有一个系统数据库 information_schema,存储着所有的数据库的相关信息,一般的, 我们利用该表可以进行一次完整的注入。以下为一般的流程。
猜数据库
1 | select schema_name from information_schema.schemata |
猜某库的数据表
1 | select table_name from information_schema.tables where table_schema=’xxxxx’ |
猜某表的所有列
1 | Select column_name from information_schema.columns where table_name=’xxxxx’ |
获取某列的内容
1 | Select *** from **** |