SQL注入基本知识点总结
SQL注入基本知识
information_schema
MySQL 中存储所有数据库名、所有表名、所有字段名的系统数据库叫 information_schema ,这是在 MySQL 数据库初始化就存在的系统库。库里存储数据库名、表名、字段名的表分别为 schemata 、
tables、columns
(原始表名为大写,但小写也能取到数据)。
SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA='数据库名'; 解释:从总表中将所需的数据库名查出来
SELECT * FROM information_schema.xxxxx WHERE TABLE_NAME = 'sss' ; 解释:从xxxx数据库中把表名为sss里面的数据查出来
表名 | 关键字段 |
---|---|
schemata | schema_name [数据库名] |
tables | table_schema [数据库名],table_name [表名] |
columns | table_schema [数据库名],table_name [表名],column_name [列名] |
select schema_name from information_schema.schemata 查询所有的数据库名称 select table_name from information_schema.tables where table_schema = 'mysql ' 查询名为 mysql 数据库中的表名 select column_name from information_schema.columns where table_name = 'user' and table_schema = 'mysql' 查询名为mysql数据库下user表中的字段名称 select (user,password) from mysql.user 查询数据库为mysql下user表中user和password字段下的内容
concat()函数
功能:将多个字符串连接成一个字符串。
语法:concat(str1, str2,...)
返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。
1:select concat (id, name, score) as info from student;
返回的结果就是 1小明79
若是嫌格式数据显示不够清楚,可以加 ‘-’
select concat (id, '-',name, '-', score) as info from student;
返回的结果就是 1-小明-79
group_coucat函数()
group_concat ( [DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'] )
将group by产生的同一个分组中的值连接起来,返回一个字符串结果
例:select name, group_concat (id) from student group by name;
小明 | 1,5,6
小丽 | 2,4
小伟 | 3
小红 | 7
这样就使用group_concat()和group by显示相同名字的人的id号
order by
语句判断,判断该表中一共有几列数据
order by 3页面回显正常,order by 4页面回显不正常,说明此表一个有3列。
union 联合查询
根据SQL语言的特性,使用联合查询联合的结果集之间必须具有相同数量的列名(也就是列数)(也就是说,必须在已知列数的情况下才能使用联合查询,所以联合查询的使用必须在 order by 之后)
查询数据库信息 @@version @@datadir
查询用户名,数据库名 user() database()
文件读取 union select 1,load_file('C:\\wondows\\win.ini')#
写入 webshell select..into outfile...
回显点
联合注入是需要显示结果的,这里就会用到一个叫做回显点的东西。
回显点就是 SQL 查询结果显示在页面上位置,有回显点的 SQL 注入叫做回显点注入。
比如一篇文章的标题、作者、时间、内容等等,这些都可能成为回显点。
继续上面的,查询字段数可以通过 order by x
实现。这边我学到一个知识点,order by
不仅可以按照表中的某个字段名排序,还可以用数字代表查询结果的列(column)进行排序。
比如查询结果有两列,id、name,order by 1
就等于 order by id
。
与 limit
不同,order by
从 1 开始计数,0 列不存在,大于查询结果列数会报错。
所以可以通过 order by x
测算出查询结果列数。
select id,name from user where id=1 order by 3
报错,则说明运行的 SQL 语句查询字段数为 2。
知道了查询结果列数,就可以通过联合查询返回需要回显的信息了。
想要显示我们需要的信息,可以将当前的查询结果置空,即判断条件改成 false。
就比如说一共有三列 ?id=1 返回正常 我们需要构造 ?id= -1 union select 1,2,3 from xxx where xxx
目的就是,数据库查询不到 id=-1 的数据,就不会有结果返回,也就没有显示,但是后面的语句会查询出来,会出现在原先的显示位置,这样就把我们想要的数据查询出来 了
sql注释符
# 单行注释 注意与url中的#区分,常编码为%23
--空格 单行注释 注意为短线短线空格
/*()*/ 多行注释 至少存在俩处的注入 /**/常用来作为空格
注入流程
是否存在注入并且判断注入类型
判断字段数 order by
确定回显点 union select 1,2
查询数据库信息 @@version @@datadir
查询用户名,数据库名 user() database()
文件读取 union select 1,load_file('C:\\wondows\\win.ini')#
写入 webshell select..into outfile...
补充一点,使用sql注入遇到转义字符串的单引号或者双引号,可使用HEX编码绕过
SQL注入----盲注
基于布尔 SQL 盲注
基于时间的 SQL 盲注
基于报错的 SQL 盲注
最新文章
- 增强:MB1A物料价格检查
- ZYNQ学习之——MIO
- jira的使用
- leetcode 日记 3sumclosest java
- 结合源码看nginx-1.4.0之nginx异步机制详解
- Java对Excel表格的操作
- 使用Git操作GitHub代码入门教程
- java_重写与重载的区别
- Nancy入门
- JavaScript之点赞特效
- Android-Tab
- 【POJ 1740】A New Stone Game
- redis 设置分布式锁要避免死锁
- S50 抓取pattern数据
- Linux下修改用户的UID、GID
- html常见的块元素和行内元素(特别注意个别块元素不能嵌套其他块元素)
- jsp相关笔记(一)
- linux提取指定列字符并打印所有内容(awk)
- hdu1255扫描线计算覆盖两次面积
- C#调用C++