视频加载失败

[NISACTF 2022]checkin Unicode 双向控制字符(Bidi)混淆

364 字
2 分钟
[NISACTF 2022]checkin Unicode 双向控制字符(Bidi)混淆

本题在线靶场#

https://www.nssctf.cn/problem/2035

代码审计#

2026-09-22_10-08-35.png
2026-09-22_10-08-35.png
可以看到显示非常的乱

把它复制粘贴到vscodex里面

2026-09-22_10-11-17.png
2026-09-22_10-11-17.png

<?php
error_reporting(0);
include "flag.php";
// ‮⁦NISACTF⁩⁦Welcome to
if ("jitanglailo" == $_GET[ahahahaha] &‮⁦+!!⁩⁦& "‮⁦ Flag!⁩⁦N1SACTF" == $_GET[‮⁦Ugeiwo⁩⁦cuishiyuan]) { //tnnd! weishenme b
echo $FLAG;
}
show_source(__FILE__);
?>

这下看清楚了,VS Code能显示出这些不可见字符的占位符— Unicode 控制字符

  • [U+202E] (RLO):从这里开始,后面的字符强制从右向左显示。
  • [U+2066] (LRI):开始一个从左向右的隔离区。
  • [U+2069] (PDI):结束隔离区。

我们在脑海中把不可见字符替换为 [RLO]、[LRI]、[PDI]:

if ("jitanglailo" == $_GET['ahahahaha'] & [RLO][LRI]+!![PDI][LRI]& " [RLO][LRI]Flag![PDI][LRI]N1SACTF" == $_GET['[RLO][LRI]Ugeiwo[PDI][LRI]cuishiyuan'])

这下就很清晰了,第三个条件为

"[RLO][LRI]Flag![PDI][LRI]N1SACTF" == $_GET['[RLO][LRI]Ugeiwo[PDI][LRI]cuishiyuan']

至于PHP 是如何解析中间这坨 & [RLO][LRI]+!![PDI][LRI]& 的?

  1. 因为 error_reporting(0),PHP 会把 [RLO][LRI] 和 [PDI][LRI] 当作未定义的常量,并降级为字符串。

  2. +!![PDI][LRI]:!! 是双重取反,任何非空字符串取反两次都是 true(即 1)。[RLO][LRI] 字符串转数字是 0。所以 0 + 1 = 1。

  3. 整个表达式变成了 & 1 &。

  4. 在 PHP 中,&(按位与)的优先级低于 ==。所以实际上变成了:(A == 1) & 1 & (B == 1)。这等价于 A && B。

构造 Payload#

既然逻辑还原了,我们要满足两个条件:

  1. ahahahaha = jitanglailo
  • 参数名必须包含特殊字符:[RLO][LRI]Ugeiwo[PDI][LRI]cuishiyua
  • 参数值必须包含特殊字符:“[RLO][LRI]Flag![PDI][LRI]N1SACTF”

所以在发送请求时,你需要将这些特殊字符进行 URL 编码(U+202E -> %E2%80%AE,U+2066 -> %E2%81%A6,U+2069 -> %E2%81%A9)。

?ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6Ugeiwo%E2%81%A9%E2%81%A6cuishiyuan=%E2%80%AE%E2%81%A6%20Flag%21%E2%81%A9%E2%81%A6N1SACTF

2026-09-22_10-38-30.png
2026-09-22_10-38-30.png

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

[NISACTF 2022]checkin Unicode 双向控制字符(Bidi)混淆
https://tuulei.cn/posts/nisactf-2022-checkin-unicode-shuang-xiang-kong-zhi-zi-fu-bid/
作者
tuulei
发布于
2026-09-22
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
tuulei
请你再闪亮一点点,尽管我太平凡。
公告
分类
标签
最新动态
站点统计
文章
13
分类
4
标签
16
总字数
17,835
运行时长
0 天
最后活动
0 天前
总访问量
--
文章目录