Iuhrey

一个常年被吊打的Web手 一个唱歌不好指弹垃圾的吉他手

关于sql注入的一些学习心得

写在前面

说实话,很久以前就有着想归纳sql注入的冲动了,但是自己的实力不够,对mysql不太了解,对于一些sql注入的题目也是一知半解,久而久之就开始对sql注入产生了逃避以及厌恶之情,最近慢慢的才发现,不会sql注入那和我吉他不会大横按一样,所以我最近恶补了一些sql注入方面的知识,写在这里一方面是为了分享一下自己的学习心得,另一方面,则是为我自己做个笔记。

sql基础知识

初入sql注入呢,我们需要了解一下我们进行sql注入的目的是什么,以及如何使用sql注入来达到我们需要得到的效果。
sql注入是我们通过我们自己可控的输入恶意的插入一些代码执行语句来使得源代码错误的执行我们的语句从而反馈给我们一些有用的信息。sql注入主要的原因是因为在使用php与mysql进行交互的时候,代码写得不严谨或是过滤不太完整。
那如何通过sql注入的注入点来读取数据库的一些信息呢?目前主要接触到的有以下几种注入:
1 get形注入,我们在测试的时候,关注一下网站的url如何出现了形如:

www.xxxxxx.xxx/?id=x

这时我们就可以考虑sql注入了。
2 post形注入,如果网站直接给你一个输入框那可以考虑考虑post形的注入
3 cookies注入,这一种主要是通过抓包观察cookies的一些规律,如果出现一些特殊的cookies类型那可以考虑试试构造sql语句的cookies来进行注入
4 其他类型的注入,比如在headers里面的一些参数可以进行注入,通过x-forwarded-for构造ip来进行注入

sql注入的基础函数

user() :当前使用者的用户名
database():当前数据库名
version():数据库版本
datadir:读取数据库的绝对路径
@@vasedir:mysql安装路径
@@version_compile_os:操作系统
concat():连接一个或者多个字符串
group_concat():连接一个组的所有字符串,并以逗号分隔每一条数据
length():返回字符串的长度
substr():截取字符串
mid():截取字符串
ascii():返回字符的ascii码
sleep(): 函数延迟代码执行若干秒

sql注入的基础语句

1 万能语句

‘ or ‘1’=’1 #
admin’) #

类似这种短小的语句是在sql注入前先试试的,不过绝大部分的网站是不可能有这种注入给我们利用的。只可能在做题里面用到。
2 union语句

union select * from where

这是我们最基本的一种查询语句。一般这种注入方式叫做联合查询注入方式。
ps 我也只会知道这两种,其他的会后续补上。

sql注入基本流程

1 首先自然是观察哪里可能存在注入点,上述我们提到的四种可能存在注入的地方需要特别注意,接下来以get形式注入为例子进行操作。
2 碰到像这种应该测试一下是什么类型的注入

xxxx/?id=1

我们可以这样来判断这是什么类型

xxxx/?id=1 and 1=1
xxxx/?id=1 and 1=2

如果第一次返回正常,第二次返回错误,或者不返回,那么可以判断这是数字型的注入,那如两次都是错误那就可以判断是字符型注入了,这只是一种区分方式,感兴趣可以去百度一波。区分不同类型对我们注入是有所帮助的。
3 如果判断为了字符型注入,那么我们接下去查询它的列数,如果我们后面查询的列数与数据库的列数不同,那么是无法正常显示我们查询的东西的。一般具体的查询我们是通过order by来查询的。

xxxx/?id=1’ order by x –+

这样一直试,知道可以判断x为止。然后再判断其显示位

xxxx/?id=-1’ union select 1,2…,x –+

注意id我们需要赋一个数据库不存在的值,这样才能显示我们要查的内容,不然的话,原来的数据可能会覆盖掉我们查询的内容。此刻回显的数字即为显示位。
4 这个时候我们就可以利用显示位和联合查询来依次爆破数据库名,表名,列名,字段了(以2为显示位)。

xxxx/?id=-1’ union select 1,database()….. –+ 或者 union select 1,schema_name… from information_schema.schemata –+
xxxx/?id=-1’ union select 1,table_name… from information_schema.tables where table_schema=’库名’ –+
xxxx/?id=-1’ union select 1,column_name… from information_schema.columns where table_name=’表名’ –+
xxxx/?id=-1’ union select 1,列名… from 表名 –+

由于在查询的时候会有很多表名列名,但是返回的数据只有一条,那我们怎么办呢?
第一我们可以使用limit m,1这个语句,作用是限制查询为第m+1条数据,我们可以通过多次查询出所有结果,或者还可以使用limit n offset m,这个语句则是查询第m条数据之后的n条数据。
第二我们可以使用concat(),以及group_concat()或是concat_ws()函数来把所查询的内容连接成字符串输出。

这些都是最基本的操作,如果在某些题目中出现过滤某些关键词的话,我们可以考虑通过绕过来注入,这是借鉴大师傅bypass的一些思路的地址:http://www.cnblogs.com/joy-nick/p/5774462.html

接下来是一些过滤了关键词但是可以注入的其他方式。

宽字节注入

在某些加了转义的sql语句中,我们无法通过’或是”闭合语句来达到我们的目的,但是如果网站使用了GBK编码的话,我们是可以通过

%df%27

来构造一个’闭合语句的,因为GBK编码是双字节编码,也就是说,如果我们构造了与%5c相关的编码,那么前两个编码会被识别为一个字符也就是汉字,然后我们的%27就被独立了出来,这是一个实例这样就成功绕过了转义语句构造出了我们需要的’
接着跟着流程走就行了,但是值得注意的一点是在后面这句查询语句where table_schema=’表名’应该使用where table_schema =数据库十六进制来代替。

初试Getshell

文件管理系统

在很久很久以前就想日站了,奈何自己的动力不足,一拖再拖导致现在的水平和其他人差距拉开太大了,不过庆幸的是在塔主的带领下,终于开始踏入了神秘的Getshell领域了。Getshell主要的手段就是上传文件,里面的文件需要具备这几个特点:。根据塔主的提示,一般文件上传漏洞的思路如下: 要深入理解也只能实际操作才能得到效果。
第一天的网站:http://202.98.28.108:10014/2sdrewe4543sd/
在给了网站的同时,网站的源码也给了出来。这个就有点白盒审计的味道了。然后还给了一个hint,flag在SERVER_ADMIN下,也就是说我们传上一个包含phpinfo()函数的php文件然后让服务器解析执行就能得到flag了。
首先打开网址毕竟是个给我们做题的网站,所以自然是有点简陋的了。观察网站发现有这么几个功能。
第一个是上传文件的功能,根据提示应该是只能上传图片文件,也就是说后缀名只能是jpg,png等等。的确在后面代码审计upload.php的时候发现了这个网站通过白名单验证限制了用户上传文件的类型

接着看看rename的功能

给出两个文本框一个要更名的文件名,一个更名后新的文件名,值得注意的是这里只是单纯的更改前面的文件名而已,并不能更改文件的后缀名,也就是说我们没办法通过把1.txt改成1.php来绕过Getshell。另一个删除功能并没有什么卵用,当然有用我也不会用。。。。
接下来查看源码看看用没有什么可以利用的东西。首先审计基础配置的文件—common.inc.php文件,一个主要的注意点由于加了addslashes()函数那么在参数方面注入是不太可能的(宽字节注入另当别论)所以可以考虑其他的方向。
审计一波主要的upload.php函数,发现有以下几个值得注意的地方这里使用了白名单过滤,上面提过就不再提了,另外值得注意的地方是文件储存的方式,网站使用了两个数组来分别储存文件名和它所对应的后缀名。这就导致了我们无法通过00截断来绕过。而且这里也使用了addslashes()函数通过文件名来进行注入也是不可能的。
不过这个网站真的没用可以利用的地方了吗?这是不太可能的,接着往下看这里是存在注入漏洞的,在更新插入的时候我们可以构造一个类似的语句来达到一些不可告人的目的。
接下来看看rename.php这个文件,这个文件是我们Getshell的关键这里是从数据库中直接查询调用出来并没有经过什么过滤了,所以我们可以利用更新的语句进行二次注入。这一段代码给我们提供了一个我们无法更改后缀名的信息,综合这以上的代码,可以分析出以下思路:
第一,我们需要上传一个php的文件让服务器解析,但是php的文件后缀名并不在白名单里面,所以问题简化为如何绕过过滤来达到我们想要的效果。
所以,我们需要使得我们一开始上传的图片类型文件更改为.php的文件,但是在更名文件里面,文件名和后缀名分开独立,我们无法达到更改后缀名的效果,那怎么办呢?其实还是有利用的地方的,还记得上面这个更新语句吗?如果我们一开始上传的文件名是一个注入语句,那么我们是可以利用这一点把文件的后缀名更改为空的,然后更新文件名为我们的木马,那就可以通过后缀名为空来更改我们上传木马的后缀。
我们需要两个文件,一个文件的文件名是我们注入语句的文件名也就是‘,extension=’’,filename=’1000.jpg.jpg通过这个语句插进更新语句那就是这种效果:

update `file` set `filename`='1000.jpg', `oldname`='',extension='',filename='1000.jpg' where `fid`={$result['fid']}  

也就是说我们已经更新了数据库,有了一个1000.jpg.空的文件了,这样我们随意取一个名字,只要不和我们上传的重名例如250.jpg那就是说我们之前的文件上传为了250.jpg.jpg
那我们之前不是插入了一个1000.jpg.空的文件吗,这行代码有一点干扰在查询的时候数据库需要一个1000.jpg的文件,也就是说我们需要再上传一个1000.jpg的文件,在这个文件里写入我们的phpinfo()函数,再通过rename功能把我们的1000.jpg.空改为1000.php.空,此时解析的就是1000.php也就是说成功解析了我们上传的shell文件,打开http://202.98.28.108:10014/2sdrewe4543sd/upload/1000.php就可以读出这个网站php的版本以及我们flag的信息了。
总体来说,这一次的Getshell让我学到了很多东西,一些基本的思路在之后会用挺大用处的,特别是一个bypass的思想,这个在之后做渗透测试的时候会很有帮助,希望能坚持下去,学习到更多的东西。

0x05 在蓝鲸打卡所学到的基本操作(Web篇)

#神奇的php在CTF中的各种花式操作
总所周知,php是一门强大的脚本语言,主要用于后端开发,在Web方面主要是作为网页与数据库交互的桥梁,也就是说,后端人员通过php来处理表单提供的数据来与数据库匹配,然后决定下一步的操作,也可以作为用户使用网站储存文件的钥匙,不过这一般都是攻击者用来盗取网站信息的工具,这也侧面说明php的功能十分的强大,用好了就可以对网站为所欲为。今天主要归纳几道涉及到PHP的题目。

变量覆盖

在我们所学的编程语言中,例如C,C++,Java等语言,如果我们需要使用一个变量,必须先定义这个变量,而在一些高级语言也就是PHP,Python等语言中是可以不必定义变量的,也就是说我们可以不必定义一个变量(也就是先初始化)直接赋值。方便之余也带了一些潜在的危害。
在网络交互时使用PHP时,即使没有$x=$_Get[‘x’]这个语句我们依旧可以通过get传参这个变量名从而覆盖原变量的值。具体一些函数例如Extract(),$$使用不当之类引起的变量覆盖问题就不细谈了,直接看实例吧:

分析所得到的源代码,发现要求我们通过file_get_contents()函数输入一个文件,这个通过php://input这个函数通过POST数据来进行赋值,所以题目Payload为

?vs=s878926199a&Ff=php://input

然后把s214587387aPOST传参给Ff完成使得两者相等得到Flag。

php应用太广了,所以,未完待续。。。。。。。。。。。。

0x04 在蓝鲸打卡所学到的基本操作(Web篇)

Hash长度拓展攻击

今天来归纳一波比较难理解的Hash长度拓展攻击。
首先在了解如何攻击之前,先理解一下sha1是如何进行加密的:
我第一次看到这个流程图的时候也是一脸懵逼,这对于一个密码学刚刚入门的人来说真的是太难了,花了很久的时间我才明白这个的原理:
首先是处理输入的字符串,如果输入的字符串字节数(注意!是字节数!)除余64是56,那么在后8位填充长度描述符具体用bit表示(这里字节的长度要用16进制来表示,前后颠倒之后再填充进去,也是常说的小端储存),如果除余之后不是56,那么会自动填充一个\x80和N个\x00知道余数为56,然后加上后八位的长度描述符,可以分成多少组64位就进行多少次的复杂操作,具体的算法就不细说了。
在处理的时候,会根据四组确定值的初始值(也称初始向量IV值)来计算这一轮的sha1值,然后再根据计算出的sha1值来替代初始的那四组值,再进行下一轮的计算,如果最终生成64位的sha1值那么这个就作为最终的sha1值输出。
接下来就是如何利用这个机制了,我们只需要知道如下几个条件就可以进行攻击了:
第一步,把我们知道的salt和message经过sha1之后的值拆分为四组,每一组分别把前后的值颠倒,作为即将加密的IV值。
第二步,打开计算MD5的脚本,把初始向量IV值更改为上一步得到的IV值,输入message,填充至56位,然后再加上长度描述符,最后加上要拓展攻击的字符,运行脚本,输出的结果就为salt+拓展攻击的md5值。
这里是MD5pad.py的脚本,集合了上述两步直接出结果。具体用法参照下文。
现在来实战看看:

题目的意思就是让你传入两个变量的值,role和hash,使得hash的值是salt加上你输入role的MD5,具体操作如下:随后把role和hash的值post一下就行了。
这一道是实验吧的题目:
抓包把可疑参数source改为1,就得到了如图所示的内容:分析代码不难看出要构造一个getmein参数和salt加username和password的MD5值相等,用脚本跑一下就出来了。把参数一一对应post过去即可。

0x03 在蓝鲸打卡所学到的基本操作(Web篇)

##Web题目由于知识太过杂乱就不按照时间顺序来归纳了

等量登入

这一次的题目是关于Hash函数漏洞的,计算hash的函数比如md5(),sha1()这两种是最为常见也是在代码审计中容易考到的。由于函数本身的缺陷以及在比较变量时候的不严谨,所以可以被大手子们上演各种花式操作来绕过。
弱类型比较:

强类型比较:

在代码审计中,碰到MD5()函数类型的比较就可以考虑0e开头的MD5值来进行构造,在碰到sha1()函数则可以考虑用数组的方式来进行构造,总的来说,理解函数的用法再来使用这个漏洞就行了。

0x02 在蓝鲸打卡所学到的基本操作(Crypto篇)

Day 4 Playfair

第四天是一种新的加密方式,通过替代的方式,将原来的字符串转换成新的字符串。这种替代的加密方式有点和凯撒密码相似,但又有所差别。以下演示加密的过程:


这一种加密方式通过增加替换元素的种类,来达到提升复杂度的目的是十分用的,而且这对于双方加密的来说是十分的公平,也就是对称加密方式。不同于上一篇所说的RSA加密,Playfair加密是十分对称的,你怎么加密的,我就怎么还原回去。

Day 5 UTF-9

这一天的题目绕的弯的确是有点多,跌跌撞撞做完我归纳了下:
首先是转码问题,上一篇中提到过一个打开文本非正常显示的问题,这次属于乱码问题,题目提示了UTF-9自然而然就是去把编码修改一下,用python的utf-9库修改一下就变成了这个:

我第一眼看到这个就觉得是AAencode之后的东西,立马把这个丢进控制台,结果发现,并没有什么效果.。。。。哦?这就很有趣了,接下来,是时候展现我的技术了,我熟练地打开CMD,然后,我飞快的敲下一行命令”shutdown -t”,我可去你妈的吧,啥题目??真是的,然后这题目就这样被我完美的解决了。
直到第二天,我看到了解析,我才发现,我的决定是对的,这个脑洞的确有点大:

真是太可恶了,怎么能这样对待萌新呢???
接下来通过Py跑一下计算出结果,而题目要求是一段字符串,也就是说怎么把数字转化为字符串呢?Hex是它们的链接,将十进制的结果转化为十六进制,也就是Hex,然后通过Py脚本(太过简单我就不贴了)转化为字符串就行了。。。。

Day 6 RSA暴力破解

最后一天的密码学又回到了RSA了,这和第三天的RSA解密有点相似,但不同的是,今天给出的是公钥,也就是说要从一个特别大的数字中分解出两个质数相乘,这是十分困难的,总用一些强大的工具给我们使用:


整体思路分解出了p,q以及原有的e那就可以生成d了,之后就和第三天的解法是一样的了。

密码学就此告一段落,收获还是有挺多的,不过密码学这个坑可谓是深不见底,我这一jio下去,不知道何时才能爬起来。

0x01 在蓝鲸打卡所学到的基本操作(Crypto篇)

怎么说呢。。。对我这个刚刚入门密码学的萌新来说,在蓝鲸打卡的几天里,密码学的知识是学到了很多的(当然对大佬来说是基本操作),所以借此,归纳一下所学到的一些知识吧(按照时间顺序)。

Day 1 摩斯密码

第一天的题目自然是最简单了的,这是题目:

第一眼看到这个就联想到了莫斯密码,因为题目只有两个元素,而只有两个元素的密码不多,最为通用的就是摩斯密码,果不其然,将其0和o转化为.和-,然后对照密码表答案就出来了。
在看到题目只有两种符号的情况下,自然而然地优先考虑莫斯密码,尝试不行之后再去考虑其他的密码类型。

Day 2 RSA加密

第二天则是一种新的加密方式,也是如今用途十分广泛的加密方式-RSA加密:

普及一下RSA加密:简单来说就是,取两个十分大的素数p和q,计算出它们的乘积n=pq,然后公开n,再计算欧拉函数∮(x)=(p-1)(q-1),计算过后找一个与∮(x)互素的小素数作为公钥进行加密,然后寻找d,使得d*e-1是欧拉函数∮(x)的k倍数,d就是用于解密的私钥,举个简单的例子:
p=23 q=11
n=253 公开
∮(x)=220
我取e=13 公开
k=1 d=17
至于这个公钥和私钥怎么加密后文再说,今天RSA加密算法了解了为后一天的学习做了一个铺垫。题目呢,运用工具直接就能出答案,自己写算法自然是最好的(虽然我不会写)。

Day 3 RSA解密

第三天带了附件我就不放题目了,今天所涉及的内容是Zip文件的伪加密以及RSA解密。
在遇到打开文件,内容并不是我们想要的东西时,就需要考虑一下了,如果是乱码的话,考虑一下把文件的编码丢进编辑器改一下,如果是空白的话,那就是遇到文件的伪加密了,今天的便是后者。

找到PK对应的Hex,显而易见,09数字显示的便是文件进行了伪加密,将其手工改成00保存就能看到原文件的内容了,打开之后看到的就是私钥了

丢进解密的工具题目就算告一段落了。
然而今天的重点不是这个伪加密,而是理解RSA公钥私钥不同解出来的内容却是一样的。
KU:e,n所构成的也就是公钥对。
KR:d,n所构成的也就是私钥对。
然后把待加密的内容分为k组并转化为数字
加密:C=M^e mod n
解密:M=C^d mod n
我们再次来实验一下:
p=23 q=11
n=253 公开
∮(x)=220
我取e=13 公开
k=1 d=17
这是前文所用的数字,以此来实验:
令M=7
C=7^13 mod 253=112
M=112^17 mod 253恰恰等于7
通过基本的验证可以确定用RSA加密是可以还原数据的,有兴趣的可以去研究为什么会还原(反正我是没兴趣,毕竟数论太他妈不是人学的了)。

0x00 关于搭建博客的一些心得

第一篇文章自然是讲讲我在搭博客所获得的收获了(其实是遇到各种各样的BUG)。
第一,hexo,node.js是不要求与教程相同的版本的,虽然有些功能不同但是大体上不会影响你博客的搭建的。
第二,千万别把你的Blog文件夹建立在需要管理员权限的地方,如果这样做了,在hexo deploy时会什么信息都不会返回的。
第三,在搭建博客时,别想着急于求成,毕竟一个好看的博客是人家花了很久才搭出来的,先把基础框架搭好,在想着逐步去完善自己的博客。
第四,遇到问题先百度,别去问你的室友(除非他非常好心),要不然你收到的回答是:“百度啊” “CNM百度啊”
“滚去百度啊”。

#最后附上我参考的链接
[基础教程][http://www.cnblogs.com/fengxiongZz/p/7707219.html]
[主题更换][https://www.jianshu.com/p/469e985288b3?from=jiantop.com]

本站总访问量