SQLmap注入启发式检测算法
1、经过setTargetEnv()就进入了checkWaf()的环节
def
checkWaf():
"""
Reference: http://seclists.org/nmap-dev/2011/q2/att-1005/http-waf-detect.nse
"""
if
any
((conf.string, conf.notString, conf.regexp, conf.dummy, conf.offline, conf.skipWaf)):
return
None
_
=
hashDBRetrieve(HASHDB_KEYS.CHECK_WAF_RESULT,
True
)
if
_
is
not
None
:
if
_:
warnMsg
=
"previous heuristics detected that the target "
warnMsg
+
=
"is protected by some kind of WAF/IPS/IDS"
logger.critical(warnMsg)
return
_
infoMsg
=
"checking if the target is protected by "
infoMsg
+
=
"some kind of WAF/IPS/IDS"
logger.info(infoMsg)
retVal
=
False
payload
=
"%d %s"
%
(randomInt(), IDS_WAF_CHECK_PAYLOAD)
value
=
""
if
not
conf.parameters.get(PLACE.GET)
else
conf.parameters[PLACE.GET]
+
DEFAULT_GET_POST_DELIMITER
value
+
=
agent.addPayloadDelimiters(
"%s=%s"
%
(randomStr(), payload))
pushValue(conf.timeout)
conf.timeout
=
IDS_WAF_CHECK_TIMEOUT
try
:
retVal
=
Request.queryPage(place
=
PLACE.GET, value
=
value, getRatioValue
=
True
, noteResponseTime
=
False
, silent
=
True
)[
1
] < IDS_WAF_CHECK_RATIO
except
SqlmapConnectionException:
retVal
=
True
finally
:
kb.matchRatio
=
None
conf.timeout
=
popValue()
if
retVal:
warnMsg
=
"heuristics detected that the target "
warnMsg
+
=
"is protected by some kind of WAF/IPS/IDS"
logger.critical(warnMsg)
if
not
conf.identifyWaf:
message
=
"do you want sqlmap to try to detect backend "
message
+
=
"WAF/IPS/IDS? [y/N] "
if
readInput(message, default
=
'N'
, boolean
=
True
):
conf.identifyWaf
=
True
if
conf.timeout
=
=
defaults.timeout:
logger.warning(
"dropping timeout to %d seconds (i.e. '--timeout=%d')"
%
(IDS_WAF_CHECK_TIMEOUT, IDS_WAF_CHECK_TIMEOUT))
conf.timeout
=
IDS_WAF_CHECK_TIMEOUT
hashDBWrite(HASHDB_KEYS.CHECK_WAF_RESULT, retVal,
True
)
return
retVal
def
heuristicCheckSqlInjection(place, parameter):
if
kb.nullConnection:
debugMsg
=
"heuristic check skipped because NULL connection used"
logger.debug(debugMsg)
return
None
origValue
=
conf.paramDict[place][parameter]
paramType
=
conf.method
if
conf.method
not
in
(
None
, HTTPMETHOD.GET, HTTPMETHOD.POST)
else
place
prefix
=
""
suffix
=
""
randStr
=
""
if
conf.prefix
or
conf.suffix:
if
conf.prefix:
prefix
=
conf.prefix
if
conf.suffix:
suffix
=
conf.suffix
while
randStr.count(
'\''
) !
=
1
or
randStr.count(
'\"'
) !
=
1
:
randStr
=
randomStr(length
=
10
, alphabet
=
HEURISTIC_CHECK_ALPHABET)
kb.heuristicMode
=
True
payload
=
"%s%s%s"
%
(prefix, randStr, suffix)
payload
=
agent.payload(place, parameter, newValue
=
payload)
page, _, _
=
Request.queryPage(payload, place, content
=
True
, raise404
=
False
)
kb.heuristicPage
=
page
kb.heuristicMode
=
False
parseFilePaths(page)
result
=
wasLastResponseDBMSError()
infoMsg
=
"heuristic (basic) test shows that %s parameter "
%
paramType
infoMsg
+
=
"'%s' might "
%
parameter
def
_(page):
return
any
(_
in
(page
or
"")
for
_
in
FORMAT_EXCEPTION_STRINGS)
casting
=
_(page)
and
not
_(kb.originalPage)
if
not
casting
and
not
result
and
kb.dynamicParameter
and
origValue.isdigit():
randInt
=
int
(randomInt())
payload
=
"%s%s%s"
%
(prefix,
"%d-%d"
%
(
int
(origValue)
+
randInt, randInt), suffix)
payload
=
agent.payload(place, parameter, newValue
=
payload, where
=
PAYLOAD.WHERE.REPLACE)
result
=
Request.queryPage(payload, place, raise404
=
False
)
if
not
result:
randStr
=
randomStr()
payload
=
"%s%s%s"
%
(prefix,
"%s.%d%s"
%
(origValue, random.randint(
1
,
9
), randStr), suffix)
payload
=
agent.payload(place, parameter, newValue
=
payload, where
=
PAYLOAD.WHERE.REPLACE)
casting
=
Request.queryPage(payload, place, raise404
=
False
)
kb.heuristicTest
=
HEURISTIC_TEST.CASTED
if
casting
else
HEURISTIC_TEST.NEGATIVE
if
not
result
else
HEURISTIC_TEST.POSITIVE
if
casting:
errMsg
=
"possible %s casting "
%
(
"integer"
if
origValue.isdigit()
else
"type"
)
errMsg
+
=
"detected (e.g. \"$%s=intval($_REQUEST['%s'])\") "
%
(parameter, parameter)
errMsg
+
=
"at the back-end web application"
logger.error(errMsg)
if
kb.ignoreCasted
is
None
:
message
=
"do you want to skip those kind of cases (and save scanning time)? %s "
%
(
"[Y/n]"
if
conf.multipleTargets
else
"[y/N]"
)
kb.ignoreCasted
=
readInput(message, default
=
'Y'
if
conf.multipleTargets
else
'N'
, boolean
=
True
)
elif
result:
infoMsg
+
=
"be injectable"
if
Backend.getErrorParsedDBMSes():
infoMsg
+
=
" (possible DBMS: '%s')"
%
Format
.getErrorParsedDBMSes()
logger.info(infoMsg)
else
:
infoMsg
+
=
"not be injectable"
logger.warn(infoMsg)
kb.heuristicMode
=
True
randStr1, randStr2
=
randomStr(NON_SQLI_CHECK_PREFIX_SUFFIX_LENGTH), randomStr(NON_SQLI_CHECK_PREFIX_SUFFIX_LENGTH)
value
=
"%s%s%s"
%
(randStr1, DUMMY_NON_SQLI_CHECK_APPENDIX, randStr2)
payload
=
"%s%s%s"
%
(prefix,
"'%s"
%
value, suffix)
payload
=
agent.payload(place, parameter, newValue
=
payload)
page, _, _
=
Request.queryPage(payload, place, content
=
True
, raise404
=
False
)
paramType
=
conf.method
if
conf.method
not
in
(
None
, HTTPMETHOD.GET, HTTPMETHOD.POST)
else
place
if
value.lower()
in
(page
or
"").lower():
infoMsg
=
"heuristic (XSS) test shows that %s parameter "
%
paramType
infoMsg
+
=
"'%s' might be vulnerable to cross-site scripting attacks"
%
parameter
logger.info(infoMsg)
for
match
in
re.finditer(FI_ERROR_REGEX, page
or
""):
if
randStr1.lower()
in
match.group(
0
).lower():
infoMsg
=
"heuristic (FI) test shows that %s parameter "
%
paramType
infoMsg
+
=
"'%s' might be vulnerable to file inclusion attacks"
%
parameter
logger.info(infoMsg)
break
kb.heuristicMode
=
False
return
kb.heuristicTest
首先是对sql注入的检测
1
|
payload = "%s%s%s" % (prefix, randStr, suffix) |
randStr就是随机生成的可导致sql语句因闭合问题而报错的字符,这个payload不是用来注入的,而是将其产生的页面作为启发式注入标准页面(kb.heuristicPage),与不注入产生的正常页面(kb.originalPage)作为一个基准性对比。
接下来是一个关键变量casting
1
|
casting = _(page) and not _(kb.originalPage) |
_()函数如下
1
2
|
def _(page): return any (_ in (page or "") for _ in FORMAT_EXCEPTION_STRINGS) |
FORMAT_EXCEPTION_STRINGS 是一些在Web服务中常见的sql语句关于变量类型出错的报错
('Type mismatch', 'Error converting', 'Conversion failed', 'String or binary data would be truncated', 'Failed to convert', 'unable to interpret text value', 'Input string was not in a correct format', 'System.FormatException', 'java.lang.NumberFormatException', 'ValueError: invalid literal', 'DataTypeMismatchException', 'CF_SQL_INTEGER', ' for CFSQLTYPE ', 'cfqueryparam cfsqltype', 'InvalidParamTypeException', 'Invalid parameter type', 'is not of type numeric', '<cfif Not IsNumeric(', 'invalid input syntax for integer', 'invalid input syntax for type', 'invalid number', 'character to number conversion error', 'unable to interpret text value', 'String was not recognized as a valid', 'Convert.ToInt', 'cannot be converted to a ', 'InvalidDataException')
casting为false就代表这种注入样例因为变量类型不统一而无法使用,所以用户可以选择跳过这些样例
第二个关键变量 result
1
|
result = wasLastResponseDBMSError() |
函数如下
1
2
3
4
5
6
|
def wasLastResponseDBMSError(): """ Returns True if the last web request resulted in a (recognized) DBMS error page """ threadData = getCurrentThreadData() return threadData.lastErrorPage and threadData.lastErrorPage[ 0 ] = = threadData.lastRequestUID |
如果启发式注入标准页面是可识别的,则返回ture,否则返回false
这也作为sqlmap启发性测试结果的标志,为true就代表可能存在注入,为false就可能不存在注入
接下来就是对于非sql注入漏洞的检测,sqlmap会随机生成可引发其他类型漏洞报错的字符,然后进行注入测试,在sqlmap源码中可以看出除了sql注入,还测试了xss与文件包含漏洞
1、内部类,java编译器生成的内部类的字节码文件的名字和通常的不同,内部类对应的字节码文件名字的格式是“外嵌类名&内部类类名”,如果将内部类添加修饰词static,则可以这样调用, RedCowForm.RedCow redCow=new RedCowForm.RedCow(122,232,333);
public class NeiBuLai {
public static void main(String[] args) {
// TODO Auto-generated method stub
RedCowForm form=new RedCowForm("德纳司");
form.showMessage();
RedCowForm.RedCow redCow=new RedCowForm.RedCow(122,232,333);
}
}
class RedCowForm{
static String formName;
RedCow cow;
RedCowForm(){
}
RedCowForm(String s){
cow=new RedCow(12,23,34);
formName=s;
}
public void showMessage(){
cow.speak();
}
static class RedCow{
String cowName="bed wos";
int height,weight,price;
// int t=0;int w=0;int p=0;
RedCow(int h, int w,int p){
height=h;
weight=w;
price=p;
}
void speak(){
System.out.println("mingzi"+cowName+"shenggao"+height+"tizhong"+weight+"shenghuozai"+formName);
}
}
}
2、匿名类匿名类继承父类的方法一个可以重写父类的方法,匿名类必须是内部类。用匿名类创建对象时直接使用父类的构造方法。
public class NiMingLei {
public static void main(String[] args) {
// TODO Auto-generated method stub
ShowBoard board=new ShowBoard();
board.showMessge(new OutPutEnglish());//这是一个OutPutAlpaabe的子类对象
board.showMessge(new OutPutAlphabe(){ public void output(){
for(char c='@';c<'*';c++)
System.out.printf("%3c",c);
}
}
);//这里是OutPutAlphabe的一个匿名类也是他的一个子类对象
}
}
abstract class OutPutAlphabet{
public abstract void output();
}
class OutPutEnglish extends OutPutAlphabet{
public void output(){
for(char c='a';c<'z';c++){
System.out.printf("%3c",c);
}
}
}
class ShowBoard{
void showMessge(OutPutAlphabet show){
show.output();
}
}
3、接口匿名类
public class JieKouNiMIng {
public static void main(String[] args) {
// TODO Auto-generated method stub
HelloMachine machine=new HelloMachine();
machine.turnON(new SpeakHello(){
public void spaek(){
System.out.println("Hello ,you are wellcome");
}
@Override
public void speak() {
// TODO Auto-generated method stub
}
});
machine.turnON(new SpeakHello(){
public void spaek(){
System.out.println("Hello ");
}
@Override
public void speak() {
// TODO Auto-generated method stub
}
});
}
}
interface SpeakHello{
void speak();
}
class HelloMachine{
public void turnON(SpeakHello hello){
hello.speak();
}
}
4、异常类的处理以及自定义异常类使用
SQLmap注入启发式检测算法的更多相关文章
- sqlmap注入入门
sqlmap注入入门 sqlmap的用法: linux中: sqlmap [选项] Windows中: python sqlmap [选项] 常用的参数及含义: 目标 -d DIRECT ...
- SQLMAP注入教程-11种常见SQLMAP使用方法详解
sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了.今天把我一直 ...
- 基于候选区域的深度学习目标检测算法R-CNN,Fast R-CNN,Faster R-CNN
参考文献 [1]Rich feature hierarchies for accurate object detection and semantic segmentation [2]Fast R-C ...
- sqlmap 注入的方法及技巧
sqlmap 注入的方法及技巧 当给 sqlmap 这么一个 url 的时候,它会: 1.判断可注入的参数 2.判断可以用那种 SQL 注入技术来注入 3.识别出哪种数据库 4.根据用户选择,读取哪些 ...
- Sqlmap注入工具
Sqlmap注入工具 http://sqlmap.org/ Sqlmap是国外的一个免费的注入工具,基于python开发,支持现在几乎所有的数据库,支持get.post.cookie注入,可以添加co ...
- 在windows系统和kali中通过sqlmap注入
第1章 在windows系统中通过sqlmap注入 1.1 环境搭建 Sqlmap是目前功能最强大,使用最为广泛的注入类工具,是一个开源软件,被集成于kaliLinux, 由于sqlmap是基于Pyt ...
- 并行Louvain社区检测算法
因为在我最近的科研中需要用到分布式的社区检测(也称为图聚类(graph clustering))算法,专门去查找了相关文献对其进行了学习.下面我们就以这篇论文IPDPS2018的文章[1]为例介绍并行 ...
- 浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
在我们使用scvmm2012的时候,经常会看到群集状态变成了这样 点开看属性后,我们发现是这样 . 发现了吗?Over-committed,如果翻译过来就是资源过载,或者说资源过量使用了,那么这个状态 ...
- 异常检测算法--Isolation Forest
南大周志华老师在2010年提出一个异常检测算法Isolation Forest,在工业界很实用,算法效果好,时间效率高,能有效处理高维数据和海量数据,这里对这个算法进行简要总结. iTree 提到森林 ...
随机推荐
- BZOJ4921「Lydsy1706月赛」互质序列
吐槽一下BZOJ没有C++11 题还是不难的 BZOJ 4921 题意 在长度为$ n$的数列中去掉非空的连续一段并保证剩下数字不少于$ 2$ 求合法的所有方案中剩下数字的最大公约数的总和 $Sol ...
- Spring所有子项目
官网地址 https://spring.io/projects 包含子项目 Spring IO Platform Spring Boot Spring Framework Spring Cloud D ...
- eclipse快捷键调试总结 -转--快捷键大全
(1)Ctrl+M --切换窗口的大小(2)Ctrl+Q --跳到最后一次的编辑处(3)F2 ---重命名类名 工程名 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时To ...
- 微信小程序学习过程
1.诞生背景: 更好的体验: 规范与管理: 2.什么是小程序: 小程序是一种不需要下载即可使用的应用,它实现了应用“触手可及”的梦想: 用户扫一扫或者搜一下即可打开应用,也体现了“用完即走”的理念: ...
- Hadoop Streaming开发要点
一.shell脚本中的相关配置 HADOOP_CMD="/usr/local/src/hadoop-1.2.1/bin/hadoop" STREAM_JAR_PATH=" ...
- linux下 gdb+coredump 调试偶发crash的程序
1. 打开 core dump 查看是否打开 ulimit -c 如果输出0, 说明没有打开. 方法一:使用命令 ulimit -c unlimited 可以打开,但是只对当前终端有效, 方法二: 配 ...
- 数字图像处理的Matlab实现(1)—绪论
第1章 绪论 1.1 什么是数字图像处理 一幅图像可以定义为一个二维函数\(f(x,y)\),这里的\(x\)和\(y\)是空间坐标,而在任意坐标\((x,y)\)处的幅度\(f\)被称为这一坐标位置 ...
- Linux信号-信号集&信号屏蔽字&捕捉信号【转】
转自:https://blog.csdn.net/Lycorisradiata__/article/details/80096203 一. 阻塞信号 1. 信号的常见其他概念 实际执行信号的处理 ...
- MySQL索引调优【转】
一.关于查询计划 其实,关于所有的关系型数据库中,在运行T-SQL语句的时候,在查询器进行编译运行的同时,都会有着自己的内部的一个优化过程,而这优化之后的产物就是:执行计划. 在SQL SERVER中 ...
- MySQL死锁查询【原创】
死锁详情查询 SELECT SUM(trx_rows_locked) AS rows_locked, SUM(trx_rows_modified) AS rows_modified, SUM(trx_ ...