当前位置: 首页 > news >正文

Web三漏洞学习(其二:sql注入)

靶场:NSSCTF 、云曦历年考核题

二、sql注入

关于sql注入之前还是做过笔记的SQL注入的原理及详细运用_车牌注入sql-CSDN博客

现在结合一些例题进行更系统的学习

SQL注入的流程

<1>寻找注入点

SQL:结构化查询语言,是与数据库相关的,一定要和数据库有交互才可能存在SQL注入

登录、注册、搜索框都是与数据库有交互的方式

<2>判断闭合方式

因为数字型不需要闭合,所以不需要判断闭合方式,所以要先判断是数字型还是字符型。

(1)先判断是数字型还是字符型

先设一个id,那么输入?id=1abcd,输入为字符型,假设id为数字型,输入就会报错,也就是说,我们先试着输入1abc(字符型),如果报错,就说明其为数字型,如果没有那它就是字符型(SQL靶场可以检测)

通俗的表示为  输入?id=1abc

报错:数字型

正常:字符型

(2)再判断闭合方式

同样假设上面的输入?id=1abc,然后加引号(无论单双)

先加单引号':  ?id=1abc'   如果加了以后没用(页面没反应),页面还是正常,

那就把单引号改为双引号":  如果加了双引号页面同样没有反应,那就放弃,下一个(这个地方不不存在SQL注入)

例如,加单引号后出现如下报错

需要注意的是,无论是单引号还是双引号都是成双成对出现的,包括(){} 【】各种括号,所以从图中"1asdf"LIMIT 0,1' at line 1来看,如果前面是双引号(相当于上面id填入的是双引号)那后面的1'就是单出来的,不满足成对存在的规则,因此前面填入的肯定不是双引号。

那既然是单引号就应该这么解释:

首先"1asdf"LIMIT 0,1'中第一个单引号和最后一个单引号表示出现错误的范围 ,而其中You have an error in your SQL指的就是这个范围有一个语法错误

而我输入的内容是1asdf '  那么把我自己输入的内容遮蔽掉就会发现右边剩下了一个单引号

右边剩下了一个单引号,就说明它的闭合方式是单引号' 而如果右边剩单引号括号('{})就说明它的闭合方式是单引号括号;右边剩单引号括号括号('{}{})就说明它的闭合方式是单引号括号括号。

这里既然找到了闭合方式是单引号,那就加个注释--+ 然后EXECUTE执行就会发现它又恢复正常了

这就说明闭合方式找对了,然后就可以把字符删掉 也是ok的

(4)验证

然后可以验证是否存在SQL漏洞,当输入1=1(真)时页面有正常显示,当输入1=2(假)时页面又报错,说明我们输入的这个内容数据库是能够执行的(存在SQL注入漏洞)

<3>判断列数 (order by 几【如2就是第二列】)

比如说现在查第5列,就会发现他不认识

但第三列有

但发现4它也不认识,就说明admin表总共就有三列

<4>联合查询

既然查出了三列,使用联合查询 union select 1,2,3(判断出几列就是几)把1改为-1   然后执行出结果来判断回显位(回显在前端的位置)

<5>取数据(database())

    (1)数据库名

database()(更换对应的列的位置)获取到数据库名为security

(2)查表名 (table_name)

删去database,留下括号,写入select语句:select table_name(表名) from information_schema.tables(从information_schema数据库下tables的这张表里面去查)

其中information_schema数据库是Mysql 5.0版本以上自带的

然后where来表示条件,条件是where table_schema='security'(查询security这个数据库)

连起来就是select table_name from information_schema.tables where table_schema='security'

(查询security这个数据库里的表名)结果执行后报错,翻译提示返回的信息超过一行

然后这里学到一个解决办法 使用group_concat把table_name变为一行

完整的语句为select group_concat(table_name) from information_schema.tables where table_schema='security'  然后执行

(3)查列名 (column_name)

把table_name改为column_name  ,tables改为columns最后加上刚刚查到的表名(emails,referers,uagents,users都可以)

所以语句改为select group_concat(column_name) from information_schema.columns where table_schema='security' (and table_name='users' )最后执行

(4)查具体数据

都查出来了,select后面的就全扔,刚查出来个username,就先看看里面有什么

语句select group_concat(username)from users,执行

可以看到所有的用户名都已查出,如果还想查密码,就将username改为password即可

需要注意的是,查出来的username和password是一一对应的,即账号和密码是相匹配的,不是随便匹配都可以的(之前做题就吃过这样的亏)

NSSCTF

【SWPUCTF 2021 新生赛】easy_sql

这题虽然之前做过,但为了学习sql,整理一下就再写一次

打开以后是杰哥的界面

注意到html网页标题的名称是  “参数是wllm”

那就传参数值试一试

首先判断注入类型数字型字符型

传1

传2 没有回显

同样的,后面的3456都没有回显

光传abc也没有回显

所以应该是数字型注入

然后判断闭合方式

接下来传1'   (单引号)

出现报错

然后传1"   (双引号)

页面又有回显  

回到报错的 1'页面,分析报错语句

注意看这个位置

这里要记住的是:无论是单引号还是双引号在sql语句中都是成对出现的,包括 ( ) { } 【】各种括号 。

所以上面的报错句应该注意到最后的一个引号,要成对则前面必有一个单引号与它成一对。

也就是说,在这个报错语句中,一对单引号 ' ' 包裹着刚才我们注入的内容:' 1' '

所以这一堆引号就该这么拆:

'   '  1'  ' LIMIT 0,1  '

所以包裹着我们注入的 1' 的就是单引号  ' ' 。也就是说明这题的闭合方式是单引号。

既然如此那加个注释: --+   

目的是把单引号注释掉

发现页面没有报错了,有了回显,这就说明闭合方式判断正确

这里还有一个验证是否存在sql漏洞的方法:

当输入1=1时(条件为真),页面正常显示或有回显

 

当输入1=2时(条件为假),页面未正常显示

 这就说明我们输入的内容数据库是能够执行的,即存在sql注入漏洞

那么接下来就是一系列的爆数据库,直到爆出需要的信息(flag)

正规的讲叫先判断列数

语句是order by

比如现在一列列爆

第一列,有

 第二列有

第三列也有

但是到了第三列就会显示它不认识了

包括后面的第5列也如此

也就是说,这个数据库里的表总的只有三列

既然查出了总列数,接下来就需要联合查询所有列数下的数据,语句 union select

这里要注意:需要把传入参数的值1改为-1

然后开始联合查询

可以看到用户名位于第2列的位置,密码位于第3列的位置 (回显位为2、3位)

接下来可以看看这两列的数据,一列列来,第2列:

有了 ,可以看到是test_db

第3列:

都是test_db ,这当然的,两个都在一个数据库(test_db)里面

爆出来的这个是数据库名

接下来查表名(table_name)

然后出现这么个东东

英语也不太好,翻译一下

ouou  我知道了,我只改了第2列数据库名的位置,忘了后面还有个第3列了

大意了haha

加入第3列

提示返回的信息超过一行

一个解决办法就是使用group_concat把table_name变为一行即可      group_concat(table_name)

得到有两个表的表名

接下来查列名(column_name ):

对应的把刚刚的表名table_name改为column_name(列名);

tables改为columns,最后加上刚查到的表名users

执行

select group_concat(column_name) from information_schema.columns where table_schema='test_db' and table_name='users'

得到列名为password

都查出来了,select后面的就全扔掉,看看列名为password的数据列里面有什么,有没有想要的数据(flag)但这里好像出了点问题,爆出来又是yyy(不对,没问题,我查的就是password,而password为yyy刚开始就告诉我了),所以问题在于没有爆出可用的列名

回去找了一下,应该是上一步爆列名的问题,命令

select group_concat(column_name) from information_schema.columns where table_schema='test_db' and table_name='users'

应该改写为

select group_concat(column_name) from information_schema.columns where table_schema='test_db'

即删去了后面的and tablename='users'

至于为什么要这么改,后面也想清楚了:

如果查列名的语句含有 and table_name='users'   这样就代表我们是查询名为users的表下的所有列名;

而如果删去 and table_name='users'  仅前面的语句就不指定表名而是查询所有表下的所有列名,这样才能把flag列名爆出来  (也就是说其实flag是存在于test_tb表下的,而并不在users表下,如果冒然的将查询列规定为users表下面,只会画蛇添足,还找不到flag)

弄清楚以后重新爆列名,不用多此一举限制查询的范围(删去 and table_name='users')

发现这次列名就全了,可以看到flag列了。

那么接下来直接爆flag

既然刚刚无意中发现flag不在users表下而是在test_tb表下,那就直接爆test_tb表的flag列即可

【SWPUCTF 2021 新生赛】sql

还是杰哥

看看翻译

Waf是防火墙嘛,所以应该没有太重要,直接按上一题的思路

同样参数还是wllm

传参数字1有回显

传参字符abc没回显

说明是数字型注入

接下来判断闭合方式,单引号:'

报错

双引号:"

页面正常

和上面那题的剖析来看是一样的单引号闭合方式

接下来把单引号注释掉,但是发现查询的时候出现js弹窗警告

说明注释符 --+ 被过滤了,那就想替代方法来替换

上查了一下:

但是

 

 

 

可以看到这里的所有方法都被过滤了。。

后面想了想,很有可能是过滤了空格,空格的替换方法:

后面又测试了很多次才发现等号也被过滤了

那就再找等号的替换方法

选择了like(小写也可以)  (但是我奇怪的是为什么在寻找闭合方式的时候用=没有报错)

然后终于绕过这两种过滤把单引号注释掉了 (页面正常显示,未报错)

接下来查列数

但是为什么没有回显

这里就感觉被过滤的字符没找准,这样太麻烦了些

后来突然想到那天在博客上问师兄的关于黑盒测试,有没有快速准确的方法,师兄给了提示:

关键字fuzz测试,然后上网学习了相关用法

大概就是利用burpsuit的Inruder模块

把包发到Intruder模块之后先clear一下

然后选择要测试的参数位置(如;username=$test$)

用$符号标记注入点(支持多个位置同时测试)

我这里对三个点进行测试

然后在Attack type中选择策略(Sniper:逐个位置顺序测试(最常用))

其他:

Battering ram:所有位置同时使用相同payload

Pitchfork:不同位置使用不同payload列表

Cluster bomb:多payload组合测试

然后选择positions Add 在Payloads标签配置测试字典:

比如现在是SQLi/SQL注入

还有XSS/跨站脚本

OS Command/命令注入

还需要自定义关键字列表

比如

'
"
SELECT
UNION
<script>
/etc/passwd
${jndi:ldap://
...(根据测试的目标补充)

还有高级设置

如添加Payload处理规则

URL编码

HTML实体编码

大小写变异(如SeLeCt)

添加注释符(如/**/)

 

 

 

 

 


http://www.mrgr.cn/news/98746.html

相关文章:

  • 树莓派超全系列教程文档--(28)boot文件夹内容
  • 【论文阅读】UniAD: Planning-oriented Autonomous Driving
  • 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?
  • 华为OD机试真题——硬件产品销售方案(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 【Java学习笔记】运算符
  • oracle查询锁表和解锁
  • 理解计算篇--正则表达式转NFA--理论部分
  • 【Java学习笔记】数据类型转换
  • Linux-ftp tftp vsftpd区别
  • 11-算法打卡-链表-删除链表的倒数第N个节点-leetcode(19)-第十一天
  • Redis高频面试题(含答案)
  • uniapp-商城-27-vuex 通用方法
  • MGR实现mysql高可用性
  • 4G/5G模组----概念+驱动+调试
  • 【八股】计算机网络
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(5):できます 完成了等 しか。。。ない 只有
  • 什么是进程?
  • 【回眸】Tessy集成测试软件使用指南(一)新手使用篇
  • 【开源项目】Excel手撕AI算法深入理解(三):时序(RNN、mamba)
  • 使用cursor进行原型图设计