刚用这个技术的时候,也是看了很多前辈的博客,并自己搭建了测试环境,还是从最基础的说起吧:
sql注入,顾名思义,就是通过sql语句去web后端的数据库打交道,凡是存在数据库的web,基本都可能存在类似的网站,在OWASP的top10里也是首屈一指的,sql注入最终的目的就是通过从url或者其他的一些地方传入一些参数,从而构建数据库查询语句,去后台查一些表项,在实际中一般用这个技术去查询管理员账户。。。举一个例子吧,在例子中使用使用Damn Vulnerable Web App这个测试平台吧,这个平台我觉得如果是用来研究这些技术的原理的话,还算方便。安装过程就不说了,直接上图吧:
1.打开dvwa:
2.点开左边的sql injection
在页面上点击提交按钮,在提交到服务器的http请求包里,会带有下列字段:GET /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit ,抓取字段的方法是使用burpsuit,使用方法不多说了。提交到后台请求如下:
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‘
下面在前面提交 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、在页面提交 1‘or 1=1 order by 1 -- 查看结果
2、在页面提交 1‘or 1=1 order by 2 -- 查看结果
3、在页面提交 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就可以了)