SQL注入攻击 作者:pandali 时间:2021年10月28日 分类:计算机技术,Mysql 字数:3447 warning: 这篇文章距离上次修改已过205天,其中的内容可能已经有所变动。 一、漏洞描述 针对SQL注入的攻击行为可描述为通过在用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序时意料之外结果的攻击行为。 二、攻击场景及形成原因 漏洞成因可以归结为以下两个原因叠加造成的: 1. 程序编写者在处理应用程序和数据库交互时,使用字符串拼接的方式构造SQL语句。 2. 未对用户可控参数进行足够的过滤便将参数内容拼接进入到SQL语句中。 SQL注入的攻击方式根据应用程序处理数据库返回内容的不同,可以分为可显注入、报错注入和盲注 报错和回显注入显而易见,盲注有时容易被忽略: 在页面无返回的情况下,攻击者也可以通过例如延时等技术来实现发现和利用注入漏洞:select 1 from te where if((MID(version(),1,1) LIKE 5,sleep(5),1) limit 0,1;判断数据库版本,执行成功浏览器返回会延时 利用BENCHMARK函数进行延时注入 ' - (IF(MID(version(),1,1) LIKE 5, BENCHMARK(100000,SHA1('true')), false)) - ' 配置补充: mysql: 避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权 禁用或限制远程访问 禁用LOCAL INFILE 降低系统特权 降低用户的数据库特权 禁用LOCAL INFILE命令 set-variable=local-infile=0 执行mysql自带的安全配置文件./bin/mysql_secure_installation mssql: 删除不必要的存储过程 use master sp_dropextendedproc ’xp_cmdshell’ 不要在数据库应用中使用sa帐号等 三、危害性 攻击者利用SQL注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。 在特别情况下还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过SQL注入漏洞直接获取webshell或者服务器系统权限。 $sql="select * from members where userid=".$_GET[userid]; $sb->query($sql); 这段代码的逻辑是根据用户请求的Userid进入数据库查询出不同的用户并且返回给用户,可以看到最终传入的字符串有一部分是根据用户的输入来控制的,一旦用户提交 poc.php?userid=1 or 1=1 最终进入程序之后传入数据库的逻辑将是 $sb->query("select * from members where userid=1 or 1=1"); 用户完全可以根据传入的内容来控制整个SQL的逻辑,实现间接控制和管理数据库的目的,这种命令(SQL语句)和数据(用户提交的查询)不分开的实现方式导致了安全漏洞的产生 SQL注入可能发生的地方是:外部数据与数据库有交互的所有地方(增删查改) 四、攻击案例 1.喵喵折sql注入: http://cms.miaomiaoz.com/login/loginApi 通过sql注入漏洞利用工具: sqlmap.py -u "http://cms.miaomiaoz.com/login/loginApi" –data "user%5Bpassword%5D=88952634&user%5Bname%5D=88952634" –dbs 攻击者通过注入得到管理员账号和密码成功进入后台 Houtai.png 通过注入漏洞泄露大量敏感信息 2. 新浪某处getshell到漫游内网 http://www.wooyun.org/bugs/wooyun-2010-093382 http://218.30.114.228/dashboard/html/cgi/top.php level1=1 and 1=2 union select 1,22222222222,3,44444,555555,6666666,77777777,8888888888,111111,0,11,12,13 into outfile '/data0/dashboard/www/dashboard/html/cgi/xxx.php'-- ;&level2=&level3=&level4=&ct=20&listType=0 通过sql注入漏洞,利用mysql into outfile 写一句话木马到xxx.php文件。 查看内部后台数据 Weibo.png 拿到机器权限后,对内网进行漫游,内网数据库暴露: 五、漏洞评级及处理 等级:严重 给出安全漏洞警告,12小时内必须进行修复。未修复漏洞之前禁止对外发布。 六、防御方法 1.使用参数检查的方式,拦截带有SQL语法的参数传入应用程序 2.使用预编译的处理方式处理拼接了用户参数的SQL语句(推荐!) 3.在参数即将进入数据库执行之前,对SQL语句的语义进行完整性检查,确认语义没有发生变化 4.在出现SQL注入漏洞时,要在出现问题的参数拼接进SQL语句前进行过滤或者校验,不要依赖程序最开始处防护代码 5.定期审计数据库执行日志,查看是否存在应用程序正常逻辑之外的SQL语句执行 推荐采用预编译的方式防止sql注入 QFrame框架: /home/q/php/Qframe/base/db/QFrameDB.php $sql = “select name from admin where id=?” $db = QFrameDB::getInstance($db_config); $db->query($sql,$param); thinkphp框架: $Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select(); $Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select(); $model->query('select * from user where id=%d and status=%d',$id,$status); $model->query('select * from user where id=%d and status=%d',array($id,$status)); 使用更安全的函数: $User = M("User"); // 实例化User对象 $User->find($_GET["id"]); 补充: 整型参数: 运用 intval函数将数据转换成整数 函数原型 int intval(mixed var, int base) var是要转换成整形的变量 base,可选,是基础数,默认是10 浮点型参数: 运用 floatval或doubleval函数分别转换单精度和双精度浮点型参数 函数原型 float floatval(mixed var) var是要转换的变量 double doubleval(mixed var) var是要转换的变量 字符型参数: 运用 addslashes函数来将单引号“’”转换成“\’”,双引号“"”转换成“\"”,反斜杠“\”转换成“\\”,NULL字符加上反斜杠“\” 函数原型 string addslashes (string str)