圈重点:注入攻击的本质,是把用户输入的数据当做代码执行。
这里有两个关键条件:
第一个是用户能够控制输入
第二个是原本程序要执行的代码,拼接了用户输入的数据然后进行执行
SQL注入能干什么?
1.获取管理员账号密码 (利用联合查询)
2.获取数据库中的信息
原本还要记录案例的学习的,但案例的讲解和实际靶场练习差不多,我就直接上靶场的练习题了!
显错注入Rank1
直接进传送门:
SQL语句我们是在url栏里执行的,所以我们关注一波url栏!
所以?id=1是个什么东东?
它是一个GET传参,根据传参值的变化,页面在不断改变!如下所示:id=2时
页面不断改变的原因可能是PHP代码里面写了if等分支语句,也可能是页面是从数据库中提取信息然后展露出来。
做个猜想,如果你是开发人员,即使是只为了后期维护方便也会更倾向于后者吧!
如何从数据库中取信息出来嘞?
之前学习过的Mysql语法就是为了今天,利用SQL查询语句。(以下内容的语法详情见mysql语法那篇文章)
select * from 表名 where 条件
进行SQL注入得有注入点,所以要探测:
常用探测手法:and 1=1 和 and 1=2
and 1=1因为恒真所以页面正常显示,and 1=2就报错了,说明极大可能在这里存在注入点
但时代的发展,现如今很多网站都有安全狗很常见的WAF所以and 1=1和and 1=2 都极大可能的被拦截
怎么办?这就要来验证文章开头的那句重点圈出来的话了:注入攻击的本质,是把用户输入的数据当做代码执行!
怎么验证?如下所示:
?id=1正常显示
后面我们用and 1=1 进行探测的时候就被网站防火墙拦截了…
发散一下思维,我不让前面的id直接等于1,举个例子我让id=2-1来试试
哎!它又能正常显示了!说明WAF没有对2-1进行拦截,同时也验证了那句话如果2-1没有当作代码执行的话它就不会返回原界面,它应该是2-1这个字符串
做个小总结,如何判断注入点:
最老的方法:
and 1=1页面正常
and 1=2页面不正常
最简单的方法:
页面后面加‘,看是否报错
学习的新方法:
如果是数字型传参,可以尝试做-1例如:
http://www.xxx.com/new.php?id=1 页面显示id=1的新闻
http://www.xxx.com/new.php?id=2-1页面显示id=1的新闻
and 1=1 and 1=2被拦截的可能性太高了
可以尝试and -1=-1 and -1=-2 and 1>0 or 1=1
或者直接or sleep(5)
我们在谈到SQL注入能干啥的问题时提到获取管理员信息,这里我们要讲的就是union联合查询
联合查询就是将两条查询语句的结果整合到同一张表上输出
联合查询的步骤简洁来说就是从库中查表,表中查字段,字段里面查数据!
注意联合查询需要两条查询语句的结果的字段数相同
问题又来了我怎么知道刚开始的语句字段是多少嘞,怎么让后面拼接的语句跟前面一致呢?
这里用到了mysql语法里的order by 排序,可以用它来试字段数!如下:
我们试了1,2,3都成功返回了结果,到4的时候它报错了,说明前面的语句有3个字段,所以union后面的语句也应该与其保持一致,如下:
这里的1,2,3不用去管它,你可以随便输,只是为了站住三个位置而已
接下来我们来进行联合查询的流程,注意一点mysql 5.0以上版本都有系统自带库存放着库和表和字段的关系的对应关系
schema.tables就是库.表(选中库中的表) database()就是当前数据库
这里只返回了一张表,那有没有其它的表呢?
这里用到了limit来取结果。
limit ?,?的形式,前面代表的是从第几条开始,后面表示的是往后取几条。注意前面的部分0就是从1开始取,依次往后类推!
相比limit我更喜欢用group_concat()
它是将所有的结果拼成字符串合并输出,如下:
我们成功获得两张表的名字,其中一个error_flag引起了我的注意,因为本道练习要提交的就是flag
那么接下来我就来查error_flag这个表里的字段,如下:
columns代表字段
返回了两个字段一个id一个flag,大致猜测我需要的是flag这个字段里的数据,那么接下来查数据呗,如下:
可以看到返回了很多条flag,那就先提交第一条试试对不对:
运气不错,一发入魂!
第一题做为了样例所以写的稍微多了些,后面的题目大同小异我就加快速度啦!
显错注入Rank2
这里发现id后面多了单引号,这里有什么不同呢?
可以发现当我们用2-1的时候,页面回显内容改变了,变成了id=2时页面回显的内容。
这是因为2-1外面套了层单引号,里面被当作了字符串输出,因为是数字所以强取了前面的数字2输出。
那怎么办?,如下:
我们在1后面加个单引号把前面闭合,后面用–+(或者–空格qwe)注释掉,中间插入SQL语句就行了。
+号在url栏里转义过来就是空格
处理完这个问题之后,我们进行联合查询,各位看官睁大眼睛…
判断注入点:
查字段:
三个字段!
查库,表字段,数据最后拿到flag:
还是四个数据,先试第一个呗
emmmm错了,那就试第二个
第二个对了,猜测一波第三题和第四题显错注入的答案分别是第3和第4个
显错注入Rank3
老样子该闭合闭合,该注释注释!
判断注入点:
查字段
省略了前面查出来还是3!
查库,表,字段,数据:
直接怼第三个答案,验证一下之前的猜想。
果不其然!!
显错注入Rank4
闭合加注释
判断注入点
查字段:
省略一下,还是老样子查到了4就报错了,还是3个字段
查库,表,字段,数据:
提交第四个答案
显错注入的练习到这里就全部结束啦!!
以上练习是在靶场进行,想实操的看官们可以自己搭建环境去sqli-labs上面进行SQL注入的实验,具体流程问度娘。
Sqlmap和Burpsuite的简单使用
工具可以帮助我们更好的测试网站
1.环境的安装(Javalpython)
使用这两个工具要先装一下环境(Sqlmap是基于python开发的/Burpsuite是基于java开发的),Sqlmap是由python2开发的,所以装python2会好一点。
python(2.7.16)环境的安装:
python(2.7.16)下载地址: https://www.python.org/ftp/python/2.7.16/python-2.7.16.amd64.msi下载好文件后直接安装就可以了
java环境的安装:
Java下载地址: https://www.java.com/zh_CN/download/windows-64bit.jsp
拿着安装软件直接默认安装就行,全部下一步下一步,环境建议安装C盘
python默认路径:C:\Python27
Java默认路径:C:\Program FileslJavalire1.8.0_211\bin
下载完之后记得配置环境变量,具体操作可以百度这里就不细说了。
工具只是为了辅助自己,但不要过于依赖工具,能力的提升终归要依靠自己的!
2.Sqlmap的基础指令
sqlmap 是用的最为广泛的自动化检测、利用SQL注入的渗透测试工具,支持多种数据库。
下载地址: https:/lgithub.com/sqlmapproject/sqlmap
下载好之后,并且配置完环境变量,就可以直接在cmd调用
通过命令我们打开sqlmap就是这个样子。(我们依旧使用显错注入的第一题作为sqlmap操作的对象)
常用最基础指令:
** -u 指定注入点**
通过sqlmap的探测我们发现了两个类型的注入,其中联合注入有三个字段和我们之前手工探测的一样。
** --dbs 跑库名**
我们看到了它跑出了所有的库名。
** --tables 跑表名**
–columns 跑字段名
–dump枚举数据
-D指定库
** -T指定表**
** -C指定字段**
至于表名,字段名,枚举数据啥的,如果不指定库,表或字段的话,它会把所有的都跑一边,这里为了节省工作量就不一一演示了,我直接指定库表去跑了!
成功使用sqlmap跑出来了所有flag字段里的4条数据
更多sqlmap指令见Sqlmap指令手册: https://www.cnblogs.com/hongfei/p/3872156.html
3.Burpsuite工具的基础使用
Burp基于抓包的攻击平台,对数据进行篡改,重放,跑包
什么是抓包:举个我在学习中授课老师说的一个相当形象化的例子
在古代,我和一个女子恋爱了,有个第三者想插足,那个时候的交流要飞鸽传书,有一天我给我女有写了一封表达思念的信,但是被第三者截获了,他看了之后篡改了我的信把它改成了分手信,于是我和女友短暂的爱情就结束了!!
问个问题:为什么我的浏览器和网页的通信要经过Burp呢?两个字代理
使用Bp要给浏览器挂代理(具体操作百度,不是很困难,以大家的聪明才智分分钟搞定!)
另外注意一下Bp要进行一次破解,具体操作也是去百度一下,这里不细说。
这里我没有找到合适的靶场,就随便开个网页来做抓包操作了,大家见谅。
我们设置的监听8080端口。
第一个模块Proxy抓包
我们点进去:
Intercept is off 就是开启抓包,我们点击开启并刷新页面,只要开了代理我们就能抓到一个数据包。
开启抓包之后刷新页面。
成功住抓到一个包。
我们看到GET请求了什么文件,Host请求了什么地址等等一些信息。
而Forward 就是放过去 Drop 就是丢弃掉
前者就是一个正常的访问,如果点了丢弃,这个页面就没有数据返回:
第二个模块Repeater单放包
如果我们抓到一个数据包,我们可以右键Send to Repeater发送到单放模块就成了一个单数据包,可以单独的对数据包进行修改:
修改完之后点击Go,右边Response是返回的结果。
到这可能大家还是有些没能感受到抓包的意义,但是由于我没找到合适的含登录页面的靶场,无法演示,便就在今后的练习中如果碰到我就在补上这段操作。
Burp功能很强大,比如还可以进行数据类型的改变。
如把GET改成POST:
点击Change request method
我们发现它改变了,反之POST改GET同样可行。
我们不仅能抓数据包同样也能抓返回包:
点击Do intercept,在点击Response to this request
这就是页面所返回的数据包内容,相当于服务器返回给你的浏览器的源代码。
假设Burp打入了受害者和服务器的交流之间,我们就能篡改我们想篡改的东西。
第三个模块User options
有点时候Burp的Response返回结果区域可能会出现一些看不到的文字,其实是一些编码的问题
我进到第三个模块修改就行了:
点击Display通用
在Character Sets这里改,正常是UTF-8改GBK,或者GBK改UTF-8,基本跳不出这两个。
好了两个工具的简单使用今天就学到了这里,以后学到更多进阶的操作和骚姿势,并在靶场实操后,我会在后面的笔记中写上。
未完待续…