SQL注入部分讲解

访客4年前黑客工具775

若有错误,还请斧正。

1.SQL注入

攻击者可在正常的SQL语句中注入自己的语句,使得原SQL语句改变并执行则为SQL注入.

整型注入

注入点数据类型为整型则为整型注入,如下

image-20201221111530311.png

image-20201221111546952.png

输入的id不同,会从数据库中取出不同的结果。我们输入的id被直接拼接进sql语句中执行,这就使得我们可以直接接管sql。通过在id处注入sql语句来获取各种信息.

在这里我们可以构造联合查询payload来获取信息,首先需要判断查询语句的字段数

,当查询字段数大于等于这个数字时页面会给出正确执行的结果。

image-20201221112033369.png

当查询字段数小于这个数字时页面会给出错误的执行结果

image-20201221112114696.png

轮番操作后就可以确定在此处的查询字段数为3.而后便可以通过联合查询来确定结果显示位。

image-20201221112240089.png

对了。此时mysql执行的sql语句为,在id部分我们需要一个数据库中没有的数据(比如0),

image-20201221112637476.png

确定了结果显示位为联合查询的数字3处,由此可借由mysql系统库(information_schema)来获取表,如下

image-20201221112926354.png

获取表的列信息如下

image-20201221113051857.png

mysql的group_concat函数可以将查询结果合并为一个结果

image-20201221113220088.png

在获取了表与列的信息和即可查询该表的具体数据

image-20201221113324626.png

字符型注入

字符型注入与整型注入差别不大,两者最主要的差别在于字符型注入需要闭合引号.当我们注入一个引号时,mysql在执行时引号不成对,则会出错。

image-20201221113848368.png

通过各种手段处理引号后则可以正常构造与整型注入类似的payload来获取各种信息.对于sql语句后面自带的引号可以采取注释、闭合等手段。

image-20201221114228657.png

image-20201221114319449.png

后面与整型相同,则不再赘述

引号处理

报错注入

在程序不输出查询结果,但会输出mysql错误信息时则可通过报错注入来获取信息.报错注入不需要像联合注入一样获取显示位,因为错误信息所在即是显示位.

image-20201221114734259.png

报错注入通常使用以下函数

updatexml

报错用法

image-20201221114951376.png

extractvalue

报错用法

image-20201221115656288.png

floor

报错用法,概率报错

image-20201221142606571.png

rand函数可在0-1之间生成一个随机数,而floor则是获得小于等于传入值的整数

image-20201221134756386.png

当我们使用rand()*2时则可以获得一个0-2之间的随机数,倘若这时使用floor则可以获得一个0或者1

image-20201221134953403.png

mysql可以使用group by 对结果进行分组,将结果相同的划为一组,count(*)可以统计结果数量

image-20201221140111500.png

image-20201221151103194.png

盲注

注入结果无任何回显即是盲注

布尔盲注

根据注入执行结果的布尔值(true,或false),页面显示不同,由此作为判断注入结果的依据即是布尔盲注

image-20201221151621075.png

image-20201221151642971.png

我们可以通过构造sql语句来逐步判断后端的结果,如下

image-20201221152206255.png

当页面显示wow时,就说明database之一个字符为s,由此,进一步注入判断出当前数据库全名为sqli.

为提高注入效率,可编写脚本如下(已注释掉highlight_file(__FILE__))

该脚本相比于手工注入,效率有了很大的提升,但是该脚本的缺点还是很明显 --- 因为每一个字符都要进行判断,从而导致运行速度不够快

故我们可以使用二分法编写一个脚本,如下

image-20201221165855506.png

延时盲注

在注入结果不会被输出,并且不管注入成功还是失败页面始终只有一个反应时,则可进行延时盲注,通过mysql执行需要一定时间的函数来作为注入正确与否的判断标准.

我的环境出了些问题,故这里用的CTFHUB->技能树->时间盲注

正常发起请求时响应时间如下,51ms

image-20201221180115151.png

sleep配合if函数,延时payload

延时后的响应时间如下(依照不同环境,响应时间不同),1047ms=1.047s

image-20201221180300140.png

故可以在if的之一个参数处构造sql语句,再通过响应时间来判断结果是否正确

image-20201221180423128.png

猜解表名payload

猜解列名payload``1 and if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name='表名'),{第几个字符},1)<{字符ascii码},sleep(1),1)`

获取值 payload``1 and if(ascii(substr((select 列名 from 表名),{第几个字符},1)<{字符ascii码},sleep(1),1)`

为提高注入效率,编写脚本如下

image-20201221181706331.png

延时盲注流程大抵如此,再罗列一些延时注入的函数如下

image-20201221185816811.png

image-20201221190603347.png

image-20201221192411914.png

参考文章离怀秋

堆叠注入

通过分号(;)来结束一条语句并同时执行其他sql语句即是堆叠注入.

image-20201221195849883.png

image-20201221200037644.png

可以通过mysql预编译语句来执行查询语句

image-20201221200541231.png

image-20201221200922050.png

image-20201221200944310.png

下面给一实例

强网杯2019 随便注

image-20201221201210882.png

image-20201221201324087.png

构造堆叠注入payload

查询数据库信息

image-20201221201409653.png

查询数据库表信息

image-20201221201503314.png

也可

image-20201221204152220.png

image-20201221202009163.png

大小写绕过限制

1';Set @a=0x73656c6563742067726f75705f636f6e636174287461626c655f6e616d65292066726f6d20696e666f726d6174696f6e5f736368656d612e7461626c6573207768657265207461626c655f736368656d613d64617461626173652829;Prepare b from @a;execute b;

image-20201221204233672.png

image-20201221202127102.png

再构造

image-20201221203615263.png

也可

1';Set @a=0x73656c6563742067726f75705f636f6e63617428636f6c756d6e5f6e616d65292066726f6d20696e666f726d6174696f6e5f736368656d612e636f6c756d6e73207768657265207461626c655f6e616d653d273139313938313039333131313435313427;Prepare b from @a;execute b;

image-20201221202654127.png

image-20201221202601595.png

最后构造

1';Set @a=0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;Prepare b from @a;execute b;

image-20201221203750374.png

image-20201221203724003.png

参考文章backlion

二次注入

在一个输入点将用户输入的含有特殊字符的字符串存入数据库,在某一个输出点将存入的字符串取出时未进行转义便拼接进另一处sql语句,所导致的sql注入即是二次注入.如下

image-20201223154924155.png

image-20201223155253134.png

实例

网鼎杯2018 Unfinish

只有一个登录、注册功能,成功登录后便进入主页!

image-20201223155832429.png
尝试注册稀奇古怪的用户名

image-20201223160640087.png

注册没有成功,尝试闭合单引号

image-20201223160731934.png

注册成功,登录查看.确定是sql注入

image-20201223160818122.png

image-20201223161248096.png

在本地测试后发现我们注入在insert中的语句可构成布尔型结果,故可进行布尔盲注

image-20201223180624972.png

fuzz一下哪些字符被过滤,哪怕bp设置1线程,也会被buuctf的限制请求干扰到,所以写脚本

image-20201223165157188.png

information被过滤了我们无法获取到表名等信息(sys数据库不一定存在),这里猜表名为flag,直接因为并不能确定列名(先测试了select flag from flag ,会出错)

先来确定我们的布尔盲注

image-20201223180112655.png

image-20201223180142281.png

image-20201223180201295.png

image-20201223180226943.png

没问题,写脚本

image-20201223181051899.png

2.题

CTFHUB

2017-赛客夏令营-Web injection

image-20201221205010462.png

image-20201221205024455.png

整型注入

判断列数,

image-20201221205111905.png

image-20201221205123687.png

获取回显位

image-20201221205214187.png

表名

image-20201221205309578.png

字段名

image-20201221205409883.png

爆值

image-20201221205455802.png

BUUCTF

WUSTCTF2020 颜值成绩查询

image-20201222102842534.png

经过一番测试发现,stunum为数字布尔注入.

image-20201222103041528.png

image-20201222103132415.png

经fuzz,发现select被过滤,但可大写select绕过

image-20201222104326421.png

image-20201222104359298.png

故编写脚本如下

image-20201222105944487.png

BJDCTF 2nd 简单注入

访问robots.txt发现提示文件hint.txt

image-20201222094154780.png

fuzz过后发现过滤了以下关键字

image-20201222094445759.png

image-20201222094813700.png

单、双引号皆被过滤。要想注入语句首先需要逃逸单引号,这里很简单提交即可将sql语句自带的一个单引号转义,进而逃逸出一个引号.而后在password处构造语句来注入数据

and被过滤,但是or可用,通过or + 异或操作使执行结果出现不同布尔值,发现页面响应信息不同.

image-20201222095405698.png

image-20201222095426326.png

测试payload与

image-20201222101854201.png

image-20201222101936170.png

故编写脚本如下

image-20201222102156379.png

SUCTF 2018 MultiSQL

正常注册后登录

image-20201222143502718.png

编辑头像处,可以上传图片

image-20201222143603634.png

用户信息与注册处存在sql注入.前者为堆叠注入、后者为二次注入。这里使用堆叠注入写入webshell

payload

image-20201222144254054.png

image-20201222144319914.png

CISCN2019 day2 easyweb

在robots.txt中发现备份文件.下载

首先需要思考单引号的闭合问题。

因为addslashes的存在无法直接使用引号闭合,也无法使用来逃逸单引号。但是代码11-12行对传入数据的替空处理可做利用。

image-20201222154353186.png

image-20201222154410886.png

构造一个即可逃逸单引号。(经过addslashes处理变成,再经过str_replace的处理,将替换为空,则得到一个)

image-20201222154607017.png

image-20201222154625425.png

image-20201222154731027.png

image-20201222154750788.png

故,可构造payload,根据页面响应内容进行布尔判断.

二分脚本

image-20201222161522752.png

登录

image-20201222161603982.png

上传常规shell,后缀不能为php,使用phtml绕过

image-20201222161823935.png

查看该文件,是用户的上传记录,记录了上传的文件名

image-20201222161846535.png

考虑修改文件名为shell,因为文件名会检测关键字php,所以使用php短标签

image-20201222162002457.png

再访问日志文件

image-20201222162031585.png

image-20201222162111840.png

RCTF2015 EasySQL

程序只有几个功能:注册、登录、修改密码、查看文章

在注册时发现有过滤一些敏感词,fuzz如下

image-20201224150431333.png

测试后发现注册点username处存在二次注入

image-20201224145015285.png

image-20201224145031520.png

过滤了and(忽略大小写)但没过滤,尝试进行报错注入

image-20201224145258540.png

admin4"&&updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema=database()))),1)#

image-20201224150729288.png

admin4"&&updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='flag'))),1)#

image-20201224151027731.png

admin4"&&updatexml(1,concat(0x7e,(select(flag)from(flag))),1)#, flag not here

老折磨怪了

image-20201224151318003.png

admin4"%26%26updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name='users'))),1)#

image-20201224151505263.png

通过这几次的结果可以看出,输出结果有长度限制,但是这不妨碍我们猜到字段为real_flag_1s_here

image-20201224151831050.png

常用的字符截取函数都被过滤了

长度690,真flag藏在里面,可以

image-20201224152216088.png

先尝试将所有结果翻转,可以看到是flag的一部分

admin4"&&updatexml(1,concat(0x7e,(select(reverse(group_concat(real_flag_1s_here)))from(users))),1)#

image-20201224152416831.png

需要想办法取剩下的一部分.这里尝试通过正则获取结果,rlike被过滤了,但是可以使用rlike的同名函数regexp

admin4"&&updatexml(1,concat(0x7e,(select(real_flag_1s_here)from(users)where(real_flag_1s_here)regexp('^flag'))),1)#

image-20201224152903347.png

两者组合

image-20201224153137359.png

给个半自动脚本

NCTF2019 SQLi

给了sql语句

image-20201224155622250.png

hint

image-20201224161823882.png

拿到密码即可getflag,ban了很多字符,截取字符的函数substr不能用,需要()的函数也都不能用

但是这里可以使用正则匹配来曲线救国

首先,使来逃逸引号,而后构造payload使得结果为true和false查看页面不同

,这里的%00并非真实的%00而是ascii码为0的字符,用该字符截断sql语句后面的引号(注释符被过滤)

image-20201224162759644.png

image-20201224162653924.png

当查询语句为真时,页面会进行重定向

image-20201224162850742.png

image-20201224162956768.png

可以将状态码作为判断正确与否的标准

故编写脚本如下

image-20201224164426928.png

CISCN2019 华北赛区 Day1 Web5 CyberPunk

image-20201224165755390.png

读取源码

image-20201224165824526.png

还发现提示文件hint.php

经过一番审计后,在search.php中发现一个注入点

image-20201224171147847.png

过滤了一些注入关键词,无法深入注入,再找其他地方

image-20201224171343276.png

image-20201224171403096.png

在change.php中发现二次注入

image-20201224175210464.png

参数未经正则检验,只使用了addslashes转义字符

在代码第21行,可以看到在更新地址时它不但修改了当前地址,还保存了旧地址。由此二次注入产生

构造payload验证

image-20201224175719866.png

image-20201224175735068.png

编写脚本如下

结果只会显示31位

测试发现存在flag.txt,读取该文件

image-20210104132935721.png

GYCTF2020 Ezsqli

image-20210111151218926.png

image-20210111151307226.png

fuzz可用字符

结果如下

substring被过滤,但是substr可以用

构造payload进行测试

image-20210111151945352.png

image-20210111152136220.png

布尔型结果,故可编写脚本了。

因为information_schema被过滤了,所以我们使用sys数据库来获取表信息

image-20210111152304149.png

脚本如下

image-20210111152647777.png

flag

image-20210111151354007.png

相关文章

直流数字电压电流表(数显直流电压电流表头)

数字表头与传统表头接线没什么大的区别,不同的是数字表头即使反接也能正确指示。需要注意的是测量值不能超过表头的满度值。如果超过必须加入分压电路(测。 数显表头电源地和输入地相同,同时串联电流表、并联电压...

专业找手机黑客(黑客接单是违法的么)

专业手机怎么找黑客 1、寻找黑客黑客完全不是你所想象的那样。专业手机接单是违法的么黑客,恋爱。去中心化。黑客接单·涉密网络保密网关配置,平台负责人,玄幻,绿野仙接单踪好词好句。数据擦除。专业手机4/4...

学校回应学生上课玩手机被退学-学生上课玩手机

近日,陕西柞水中学一学生上课玩手机被退学,此事引起了网友的广泛关注,9月28日,学校回应学生上课玩手机被退学,目前学校已经收回了退学处分,上课玩手机被退学的学生也将回到学校继续学业,而实际上,在柞水中...

月经来了痛经吃什么药(来月经痛经吃什么最好)

女性痛经应该吃什么?我相信每个人都熟悉痛经。许多妇女都经历过痛经。痛经是一件非常困难的事情。你知道痛经该吃什么吗?我可以吃什么来治疗痛经?女人有痛经是有原因的!不良的生活习惯和不健康的饮食会导致痛经。...

淘宝直播怎么弄录播(淘宝直播录播操作指南)

淘宝直播怎么弄录播(淘宝直播录播操作指南)

如今在网络上手机看直播的人许多,直播的内容也非常丰富,手机游戏、日常生活、歌唱啥都有,手机看直播的情况下,有时会想把直播间录制视频出来,用迅捷屏幕录像工具就可以视频录制直播间视频。...

手机怎么控制别的手机网络(如何在手机上控制网络)

手机怎么控制别的手机网络(如何在手机上控制网络)

本文导读目录: 1、怎样使用手机远程控制控制网络 2、一部手机如何远程操作另一部手机? 3、手机怎么实现远程控制? 4、在手机上如何限制他人网速 5、怎样远程控制别人的手机? 6、...