写点什么

SQL 注入

作者:w010w
  • 2022-10-29
    北京
  • 本文字数:946 字

    阅读完需:约 3 分钟

用户输入的数据被当作 sql 代码执行(用户输入的叫数据,可以输入非预期的)

用户可以输入任何字符;程序本身要执行的代码,拼接了用户的输入,然后执行了


闭合:传入引号,让传入引号和原本引号配对,注释掉后面的引号(引号内的是数据,不是代码)

‘ " ") ')

select * from table where id='1' and 1=1 -- ww'

这句,紧跟 1 后面的引号和原本引号配对,后面的 and 1=1 是代码,-- 是注释,后面那个原本的引号被注释掉了,所以就会执行 select 语句和 and 1=1 代码

检测是否有 sql 注入:

and 1=1 页面返回正确

and 1=2 页面返回错误

上述两条满足,可能存在 sql 注入

用 and ,本来的一个条件变成两个条件

id =2-1 若返回了 id=1 的值,一定存在 sql 注入

因为 2-1 被运算了,即被当作代码执行了

get 传参会把+理解为空格(url 编码)

通过 sql 注入获得数据库信息

union 联合查询 一起执行多条 sql 语句

语句 A union 语句 B

要求:两条语句得出结果的字段数相等

select database() //查询库名

字段相等------B 语句输出的字段可以控制

select 1,2,3;

这条语句实际上没有向任何表查找值,返回就是输入的一个数组,是个 1 行 n 列的表,表的属性名和值都是输入的数组

显示位:数据库中内容选择性输出,显示的(select 1,2,3,...的结果)是输出点

假设这时 3 是输出点,就可以 select 1,2,database() 输出库名

(这时如果有了库名)就要去找表名了

表名:系统自带库 or 爆破

MySQL 有系统自带库 information_schema

tables:数据库中库和表的对应

select table_name from information_schema.tables where table_schema=database();
复制代码

得到该数据库中的表名

库.表.字段->选中该字段

(这时拿到了表名,假设为 admain)接下来要找字段名

columns:系统自带库,里面的字段有 TABLE_SCHEMA、TABLE_NAME、COLUMN_NAME

select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='admain'
复制代码

找当前库(database()得出的当前库名)里的,admain 表里的信息

这里 1,2,column_name 是因为之前假设显示位是 3

不能用 select *,因为 union select 要字段数相同

select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='admain' limit 0,1
复制代码

limit 1,1

limit 2,1

...

直到没有显示,就拿到了所有字段名

这里库表字段都出了,就可以 select 出数据了

发布于: 刚刚阅读数: 3
用户头像

w010w

关注

还未添加个人签名 2022-10-17 加入

还未添加个人简介

评论

发布
暂无评论
SQL注入_网络安全_w010w_InfoQ写作社区