Showing posts with label developer. Show all posts
Showing posts with label developer. Show all posts

20070319

A Really Best Good Practice

It's been a few years since I've written a lot of code. Certainly I've written individual scripts to perform particular hacks, and I've cobbled togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r little systems here and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past few years, but not writing code day in and day out, I had forgotten cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of something very important.
Last week, I was re-introduced to manual code review - and on paper at that. I used to have a co-worker who always insisted on printing out code, complete with line numbers. He'd have a highlighter and a pencil handy. I never really understood what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 big deal was. But last week, being re-introduced to it, I saw value in it like I had never seen.
There's a great deal of value in getting your code away from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 computer to analyze it. When you review it on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 computer, you have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to fix it right away, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than see pieces in context to determine better architectural changes that you might not have ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise observed. Also, getting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code on paper gives you cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opportunity to really focus on a section of code, without being distracted by ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r sections, or (heaven forbid) email, IM, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newsreader, etc.
And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's even greater value in getting your code in front of your teammates. Even if you're cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 sharpest person on your team (I am not), you can learn from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 less sharp on your team, and you're doing a benefit to those on your team who aren't familiar with particular algorithms or techniques.
So if you don't do it, begin doing team code reviews. On paper. With a highlighter and a pencil. And if you can't do it on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire codebase, do it particularly on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most critical sections of code (which might not be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most interesting parts). You might actually find some things a static analysis or a pen test might not find. And you just might learn some things that help you write better code cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first time.

20070307

Good Habits Part II-c: Output Filtering SQL LIKE clauses

As I had said at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 beginning of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "good habits" series, I wanted to cover more than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usual suspects. So here's one that seems to frequently get missed....

When creating Prepared Statements or Parameterized Queries, everybody knows how to use placeholders for literals where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire literal is being replaced. For example, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than:

stmt.prepare("SELECT lastname, firstname FROM person WHERE lastname = '" + strLastName + "'");

It's better to do something like:

stmt = conn.prepareStatement("SELECT lastname, firstname FROM person WHERE lastname = ?");

But what about a like clause?

WHERE lastname LIKE '" + strLastName + "%'"

Well, you can actually include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 literal as a parameter and concatenate cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trailing wildcard:

WHERE lastname LIKE ? + '%'

Now I just wish I knew how to deal with underbars - a single character wildcard - as part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 literal, while still giving cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 safety of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 prepared statement.

20070306

Good Habits Part II-b: Output Filtering LDAP

I did some research before this one, and it's sad that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re seems to be so little support in built-in libraries for dealing with output filtering (er - racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r "parameterized LDAP queries").

LDAP searches are every bit as susceptible to injection flaws as any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r presentation engine. Fortunately, Java provides a parameterized search method. Unfortunately, I can't seem to find an equivalent in ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r API's.

In Java, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than simply building cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 query by concatenating user input, a la:
qry = "(cn=" + strName + ")";
Where strName is injectable (user can include * to return all names, a bad thing, or use parencá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365sis to close cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 query, or include ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r attributes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 search), a better approach is to do something like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:
qry = "(cn={0})";
result = ctx.search(root, qry, new String[] {strName}, ctls);
With that, strName is properly escaped before being injected into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 query.

I looked for how to do this in Perl's Net::LDAP, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 OpenLDAP C libraries, PHP, and Ruby, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y all seem to require cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 encoding. The search filter RFC only seems to indicate that *, ), (, \, and need to be encoded, using a backslash followed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hex of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ASCII value of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 character, which would seem to be enough. However, you need to be very careful of what character encoding you're expecting your input in, and any escapes that might be taking place cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re.

So in Java, do your self a favor and use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 search() that takes an Object[] as one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parameters. In ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r languages, be very careful on output filtering.

20070226

More on Output Filtering Command Calls

Link

The C example I gave was incomplete, by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way - that includes no way to do IPC. It simply calls cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 downstream process but doesn't read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results or anything. If you add pipe(2) and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary read/write loops on each of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 processes, it can get quite un-pretty very quickly with all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 necessary error checking. Certainly not impossible - that's why cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 calls are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, but unless you're really comfortable writing that sort of stuff, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's some more motivation to try to avoid command calls. You've been warned.

20070224

Good Habits Part II-a: Safe Command Execution

If you've been even moderately exposed to application security, particularly web application security, you should see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 title and immediately think I've lost my mind. With output filtering, since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are so very many examples of how to do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more common things (HTML encoding, SQL Prepared statements, etc.), I thought with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 output filtering examples, I'd try to do a couple of twists on each of those. So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 examples I give will not be typical.

That being said, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 absolute first recommendation with command execution is don't do it! At all. If you can possibly avoid it. Do anything you can to not have to do command execution.

Now that that is cleared, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is a safe (well, safer) way to deal with command execution than trying to deal with shell metacharacters yourself. Almost all environments and frameworks have a form of a multi-argument command execution function. In *nix environments, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're all based on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 execve(2) command and its descendants (execl(3), execlp(3), execle(3), execv(3), execvp(3), and execvP(3)). Here's how you deal with this in some of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more common environments:

C/C++
execve(2) and descendants replace cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 current command with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 one specified. So if you only want cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command executed and need to do something afterwards, you must fork(2) first. Dealing with input and output is left as an exercise for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reader. In P-code, it looks something like this:

pid = fork();
if (pid) {
/* This is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parent process.
wait for junior to finish up. */
wpid = wait(pid, &status, flags);
} else {
/* I'm cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 child process.
call my nasty command-line */
execv(cmd, args);
}
Now you probably don't want to spend a lot of time parsing environment and such in a C CGI, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 example is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re because it applies to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r environments, such as...

Perl
P-code looks exactly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same. But I need to mention that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 usual way of doing execution in Perl is to use backticks. DO NOT DO THIS! You can't possibly do enough input validation to know that every metacharacter will be taken care of. And even if you get it right, you're going to make mistakes in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 future. Also, don't do system() which would seem to be a good way to keep from replacing this process - it behaves cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 backticks, so metacharacters aren't properly escaped. Do it just like you do in C/C++ - fork, exec, wait.

Ruby
The scripting languages closely tied to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system are nice because I don't have to spell out new examples. With Ruby, use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C/C++ means. It's harder, but that's what you get for thinking you need command execution. Fortunately, because of closures, it's a little prettier in Ruby:
fork {
exec(cmd, args)
}
Process.wait


PHP
Not that I'm lazy (okay, I am) but pcntl functions actually have to be enabled at compile time. I don't use PHP much, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 PHP I have here wasn't compiled with it enabled, and I won't be compiling anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r anytime soon to enable it. The functions work just like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir C parents, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 model will look like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rs:
$pid = pcntl_fork();
if ($pid) {
# In cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 parent
} else {
pcntl_exec($cmd, $args);
}
With all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C derivatives, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a lot more error checking you could and should do. It would behoove you to find out about zombie processes, reaping dead children, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 like. And again - if you insist on doing command execution, you asked for it.

Java
Java's version of "safely" starting a command is a little more elegant (IMO) than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C derivatives. In Java, it's much easier to get STDIN, STDOUT, and STDERR handles for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 newly-created process. If you have a pre-1.5 Java, you can use Runtime.exec(String[]), and if you have 1.5 or newer, you can use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new ProcessBuilder, whose two contructors are a List version and a String... varargs version. Runtime.exec(String) does not escape shell metacharacters, so stay away from it.

When you call Runtime.exec() or ProcessBuilder.start(), you'll be returned a Process object that you can use to wait for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process to complete, and it also has input and output handles to get results from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process, as well as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 return code.

.NET
Sadly, from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reading I've done on fixing this in .NET, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's not a really good solution. There's a nice OO interface as in Java - System.Diagnostics.Process, but Process has an Arguments property that is a single string with all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 arguments, so it'll be processed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 shell with all its metacharacters. So you're going to end up being stuck with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Windows API for starting commands to work around those, which is even uglier than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fork, exec, wait set on *nix'es. If anybody has a more elegant solution that includes metacharacter filtering on .NET, please let me know.

Conclusion
Now, you still have lots of ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things to consider - has cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 command you want to call been replaced by some ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r? How does environment play into all of this? And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most important thing to consider is whose effective ID will be running this process. Just like any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r form of injection, you still have to consider cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rights of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 process that starts this off.

And let me reiterate - don't do this at all unless it's absolutely, positively necessary and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is no ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r means to accomplish what it is you want to do.

20070223

Too Much cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Perfectionist

I think I'm too much cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 perfectionist. I get too worked up about doing things "cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right way". In a perfect world:

  • We'd not focus only on making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem go away, but also removing our own sensitivity to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem
  • We wouldn't need application firewalls because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re would exist no semantic flaws.
  • We wouldn't need ethical hackers. They're smart and creative, and I like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m a lot - I was one. But if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 world was perfect we wouldn't need cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m.
  • Perfect code would come out of user acceptance testing, which would go much quicker without a security review.
  • There's no security review (!) during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user acceptance testing, because we know perfect code came out of Integration Testing.
  • Integration Testing, integration testing actually gets to test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 integration of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 system and its operation under stress.
  • Component Integration would be much faster because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 components don't have to be tested for security.
  • All of this because our developers aren't taught about security, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're well-versed in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fundamentals of writing academically-correct code, without flaws, security related or ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365rwise.
  • And also because our engineers engineer secure designs. Flow is checked between phases of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application just like geological survey software is certain that particular requirements have been met before measurements begin. Assertions can be made about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application, and consistency of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se states can be macá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365matically and logically proven.
  • Developers know to write academically correct code and engineers design secure transitions and transactions because really sharp security practitioners are involved from engineering from day one - during cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 imagination phase.
  • The American League wouldn't have a designated hitter.
Now am I proposing that you don't do all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se things? Heck no! But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 earlier security is involved in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 engineering of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 better trained your coders are at writing fundamentally flawless code, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 better your engineers are at being able to guarantee state and make assertions that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 state of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application is known at any point, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more secure applications will be, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 less re-work that will need to take place, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 faster your ethical hackers will be able to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 report (and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 more frustrated cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'll feel).

But because our engineers have been raised on a steady diet of trusting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application to behave itself, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers not understanding that users will push cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wrong buttons, we really need to do all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following:
  • Work on making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem go away.
  • Use ethical hacking at multiple phases of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lifecycle to find logical flaws.
  • Use black-box application scanners throughout cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lifecycle to discover semantic flaws in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application.
  • Use application firewalls (yuck!) to make sure that even if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 blackbox testing didn't catch everything, nothing new gets through.
  • Have security codeheads perform source code analysis to find logical flaws.
  • Have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers perform static analysis on source code to find semantic flaws.
  • Let cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 American League have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir DH.
Long story short - just anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r rant that security flaws aren't only security flaws. They're actually more dangerous looking versions of flaws that 30 years ago, computer scientists were trained to not allow to happen. (Not saying that always worked, eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, though).

20070219

Good Habits Part I: Input Validation

Link

In a previous post, I made mention that many security flaws are really cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 result of a lack of good programming practices. Since I'm a solutions-oriented type, here's Part 1 of <> on some of those good habits.

My colleagues will probably have a heart attack upon reading that Input Validation is my first post on good habits, as I've always been very passionate about output filtering. But I've always felt that proper business-rule input validation is critical.

Remember back to your days as a wee tot programming in turtle logo on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apple II-e. Or maybe just remember back to programming in BASIC on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 C=64 or TRS-80. (I realize I'm dating myself here). When you were first learning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basics of programming, one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most important things you had to do as soon as you took input from a user, from a file, or from thin air, was to verify that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type of data received was consistent with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 type of data you intended to operate on. This was absolutely critical to having cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application behave as expected.

C and assembler programmers know this very well. If you don't deal with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right type of input in your application, you'll get very odd results. Things like reading random areas of memory, buffer overruns, fencepost errors, and on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 rare occasion, you'll give your application cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ability to inject new handlers into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Interrupt Vector Table. But somewhere around VB4, and those ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r 4-GL's, when components were coupled to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 code that deals with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 design interface allowed but didn't require you to specify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 format of incoming data, applications went very quickly from prototype to production, and those simple requirements were left by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wayside. (I think I'm guilty of telling people "Don't enter apostrophes, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y mess things up" as well.)

Things didn't improve when we made web applications. And at some point security professionals thought cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'd start recommending input validation again. But since cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application security field seems to have evolved out of network security, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than application development, security professionals always made recommendations regarding "malicious characters" (a term that makes me sick to my stomach). So those developers who have effectively been un-trained (or never trained at all) of good input validation habits are now being drawn into what is almost as bad - blacklist input validation. I say almost as bad because it blacklist input validation provides very, very little protection (just ask MySpace), but gives developers a false sense of security.

So what are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good habits? I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 best approach to input validation is to follow this (pretty well agreed-upon) formula:

  1. Whitelist input validation. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 specific item requested or sent by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user isn't in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list, reject cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value. And this can happen in more places than you might think. If you have a jump page, you know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pages you expect to send your users to off your site, so enumerate those, and use a level of indirection so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user can only send, say integers, which index into an array with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list of sites that you can jump to.
  2. Positive regex matching. This is where you specify a regular expression that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 field must match. Phone number matching might look (in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 US) something like: /\(?\d{3}[)-]?\d{3}-?\d{4}/, and if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 data doesn't match that, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n reject. Surnames might match /^([a-zA-Z]+[ '-])?[A-Z][A-Za-z]+$/. If I get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time, I'll reconstruct my regex for matching an IP address without having to do arithmetic on each octet.
  3. Negative regex matching. This is "don't allow malicious characters". I hate this philosophy. There are a billion ways that "malicious characters" (did cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bytes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves intend harm?) can be encoded on input. If you're stuck with this, you had better be doing presentation filtering (anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r good habit) furcá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r down cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 pipe - you are bound to miss something.


So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re you have it. Deal with what you expect, first. And please use libraries where possible like cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Apache Commons Validator, which will give you a really consistent interface for validating things. And really, really look for chances to apply a level of indirection. Like I say, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are probably more places that you can do that than you might think. (Primary key fields, jump URL's, any list, etc.)

20070214

It's our own fault

Security practitioners are actually a large part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 reason developers aren't truly getting better at security. As security practitioners, we've told developers to actually think about security, but because we don't know enough about development, we've actually lessened cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 degree of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem. Let me give a few examples, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results of that...

  • Cross-site Scripting - is actually just an extension of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 old < or > problem. This is also partially browsers' faults for allowing malformed HTML, but I digress.
  • SQL Injection - just an extension of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 question "what happens when somebody sends something that mucks up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 statement?"
  • XSRF - just an extension of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 thing we used to solve by adding "Please only submit cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form once"

It's not that those threats aren't threats against security. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real solutions to those problems are solutions to ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r problems. But as security practitioners, we don't seem to understand that all HTML output should be encoded in case something would mess up cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 validity of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 HTML.

The end result is that we're able to identify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 things we deem to be security flaws, and developers "fix" those specific findings to make us go away, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y never really learn to write better code. They don't see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 correlation between security findings and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real solutions to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 problem.

Now, security practitioners aren't cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 only ones at fault:
  • All programming books are at fault because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y tell you how to write cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 language, and in being focused on getting functionality right, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y completely abandon writing good code.
  • Classrooms are at fault because rarely do students take a class on dealing with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 unexpected. Most entry-level programmers assume people will use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application just as expected, with no keystroke errors.
  • It's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fault of QA testers, because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y test cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 application for functionality and load, but not for dealing with erroneous behavior.
  • It's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fault of timelines (not sure who to really blame that on - customers? managers? CEO's?) because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 entire development lifecycle is geared around functionality, not necessarily quality of said functionality.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 short part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 story here is that when a "security problem" exists, see if you can determine cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real cause, so that developers can get into good habits. Good habits that will be covered in more detail in later posts....

20070208

Limiting Script Injection in Dynamic Script

One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 places you see script injection is actually inside of dynamically-generated javascript. XSS doesn't just have to happen in HTML, and it's actually somewhat surprising how often it happens in Javascript.

If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dynamically-created script is in an HTML page, a handy trick to work around this is to actually move cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dynamic parts outside of javascript. When you include dynamic pieces with user-controlled data inside cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are so many more characters to deal with, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker doesn't have to generate HTML tags to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir script executed.

Take cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 following example:


...

...

In that simple example, normal HTML encoding won't work because you've got apostrophes. But if you're inside double quotes, you have to deal with those, and apostrophes might be perfectly legitimate characters. To deal with that easily, just replace it with something like this:

...

...




This way, you don't have to think about what kind of quotes you're in (if any), you just let your framework's trusty encoding library do cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 heavy lifting for you.

20070205

OWASP Top 10 2007 Update RC1 - A3 A4

Link

A3 - Malicious File Execution - or is it Insecure Remote File Include? The names are used interchangeably in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document, which is annoying. By looking at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 name, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y appear to mean entirely different things. And equally irritating is that it appears to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same flaw as A4, except A4 could also include key exposure.

The more I read it, it appears that this is supposed to be inclusion or execution of things that are not supposed to be part of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web application at all, which would make it just anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r injection attack (see A2). But I'm odd in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 way I want to categorize things. Or on anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r read, it appears to imply that actual code submitted by users is to be executed by cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web server - even more shocking that people would somehow find a legitimate need to do this.

One of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 recommendations cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is to use a level of indirection, but it's very far down on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 list. You as a developer know what it's okay for a user to access, so make sure to abstract that so that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user doesn't get to tell you what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can do.

With cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 confusion I have between this and A4, I'll have more interesting things to say about...

A4 Insecure Direct Object Reference
Again, this appears to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same as A3, but A3 seemed to be really really focused on PHP type flaws (although cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y say you can do similar things with .NET or J2EE apps). The Verifying Security section implies that static analysis tools can't determine what does and doesn't need access control, but from my experience, all of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m will flag places where filename injection can take place, and where key exposure takes place -this is a far safer approach when you get false positives, racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than false negatives, although it does require a manual analysis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results to determine what is acceptable.

What's funny about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 example is that while SQL Injection isn't possible because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y use parseInt on both parameters, you still should use parameterized queries on every single query, without fail. There are more reasons to use parameterized queries than just to be rid of SQL Injection, and to make recommendation in one place to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n to fail to do so later makes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document look really really bad. What if "cartID" becomes a CHAR type later on?

Fortunately, both of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se flaws recommend a level of indirection as a good fix. Unfortunately, I can't tell enough difference between cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 two vulnerabilities to actually call cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m different vulnerabilities. These types of unclarity will make those who don't always look at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 document (developers) run away from it.

20070125

Stopping XSS but allowing HTML is Hard

Link

RSnake has a post today that made me laugh out loud as soon as I read it. But racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than say "I told you so" (i.e. here, and here) I thought I'd give those of you who INSIST on allowing users to enter HTML into your site a couple of ways you might make it work:

1) You could use a wiki markup library. Many wiki's use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same markup semantics (and it isn't HTML), so I'm shocked that I did a quick search for just cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 markup library and haven't found one.
2) You could require your users to provide strict XML. The benefit here is that you have good XML parsers available that will puke if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XML is not well-formed. The benefit of having well-formed XML is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you can cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n whitelist cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tags and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attributes allowed for those tags. So racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than trying to get rid of anything that looks like it might be script, only allow stuff that you specify. And you only specify cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bare minimum folks might need to get by with.
3) Combination of 1 and 2. Not saying it's perfect, but that's what Google does with Blogger. But cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y allow far more formatting than is probably necessary for most user-controlled display.

So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re you go. And of course, even when you do one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se methods, you still need really sharp people like RSnake and kuza55 to check it out. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a way to script it, those cats will find it.

20070124

Clarifying: A Rude Awakening

Link

I've spoken to a couple of people off-line about this post, and I'm glad for cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 positive feedback I've gotten, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 questions are sometimes more valuable to me. A friend asked about this statement:

I've had this same rant over and over and over. And believe me - my primary goal in documenting findings is documenting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in such a way that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 individual problems get fixed. But management makes decisions based on metrics. Managers deal with many, many, many facets of production, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need things abstracted. They could really care less about how many reflected XSS flaws cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are versus persisted - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y want to know how much money cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're gonna lose if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't fix it, and how much money it's gonna cost cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to fix it.
One thing I didn't make very clear cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re - management in making cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir decisions based on money is not misguided. There are regulatory issues now that make fixing some flaws critical, but managers have an obligation to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir customers and to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir stockholders. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 risk vs. reward scenario doesn't work out right, a mitigating control oughtn't be implemented. I just wish cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re weren't unfortunate real people on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r end of that flaw - actual victims of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacks.

Point well taken, friend. You know who you are.

Breaking out of Same-Domain Constraints - Something useful

Link

What I had decided earlier was that breaking out of Same-site constraints wasn't that useful. But I thought of an interesting way of using it to break request tokens.

I'm not positive if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a better name, but one of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 biggest recommendations for dealing with XSRF is to use request tokens. You make a really big random number, put it in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user's session, and also put it in a hidden form element on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form. When cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user comes back, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y carry cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 server compares cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 form token to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session token. If cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't match, fail cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request. Theoretically, a user took an XSRF link from anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r site wouldn't be carrying this token.

But what if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's an XSS vulnerability anywhere on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target XSRF site? Here's cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 workflow:

  1. Attacker gives cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim script to carry to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 injection point on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 target site.
  2. This script collects cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token value from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hidden form element.
  3. The script generates a request back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker's site. The request back will include cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request token.
  4. The attacker site generates javascript to request cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ultimate target URL with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token included.
Note that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ultimate page we want to call (order widgets) doesn't have to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XSS vulnerability. If Change Profile has a scripting vulnerability, we can use that page just to gacá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token and carry out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remainder of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attack.

This will work in many cases because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token doesn't include any ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r information about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requesting site. In order to combat this, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 first (obvious) step is to not have any XSS vulnerabilities on pages that hand out tokens. Better yet, don't have any XSS. But if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are any, you also have to somehow tie cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page that genned it. So maybe your token generation looks something like:
  • k1 = [large random number]
  • k2 = [key signifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 proper target]
  • token = f(k1 + k2)
  • Store k1 in session
Then cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 check becomes:
  • k1 = [k1 from session]
  • k2 = [cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 key for this action]
  • token = f(k1 + k2)
  • compare token to request(token)
This ties a request token to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action that uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token.

Under normal circumstances, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user carries a random number that matches what's in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session, it goes through. That number only gets re-generated when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y request a new form. And if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's no tying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 number cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user carries to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 action, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n any form can post to any action.

kuza55, Anurag Agarwal and all those ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cats who like to break out of same-site checks sure are making life difficult. Fortunately, with this, your best bet is to get rid of all your output filtering flaws.

20070123

Breaking out of Same-Domain Constraints

Link

There have been a few articles in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past on working around same-domain policies. I kinda' disregarded cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 past because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y still require an XSS injection point, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things that are still effective with XSS.

But a coworker today dinged me about trying to make an OTP proxy using a single XSS point. So I did a little futzing around with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 DOM, and when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 page loaded, replaced cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 submit button with a new button that evades same-domain by genning a

20070119

What Can We Learn From Sports?

A member of a local coaching staff was recently let go. In order to justify that he shouldn't have been fired, he produced some stats that basically said that his portion of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 team was as effective this year as it was in a previously very successful year.

IBM, as a sponsor of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 NBA, awards a player each year cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 "IBM Award", which is based on a formula of really common statistics that add up to what IBM considers cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 individual player who made cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 greatest contribution to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir team. The formula I've seen is really simple, but I remember when IBM was really pushing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir sponsorship (I believe it was 2000-2001 when Tim Duncan won it), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y also had some really convoluted stats that didn't go toward an award. It included things like "Field Goals Attempted in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 4th quarter of a game cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 team trailed after cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 3rd quarter where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 team actually won" and things like that.

Baseball as a game is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 king of stats. There are a million different ways to slice and dice cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 actions of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game into (somewhat) meaningful stats.

American football has some really interesting stats that help oddsmakers to set cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 line on a game. The most interesting ones are environmental - remember way back when, when Tampa Bay had never won a game when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 temperature was below 40°F/4°C? And does anybody really understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 quarterback rating?

Even football (soccer to Americans) has some interesting stats, even though cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 game is so simple to understand. There aren't yard lines (except cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 18 and 6, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 penalty spot at 12 yards), but it's amazing cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 kind of stats cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can come up with for a game where cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re seems to be one thing going on all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 time.

So why all this talk about sports? If a member of a coaching staff can prove he was no worse this year than a few years ago statistically, why is it so difficult for us to come up with meaningful statistics. I understand cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re is an OWASP Project to Define Common Metrics, which for a very long time was a very quiet mailing list. But how do we measure security in meaningful ways - not only a single assessment of an application at a single point in time, but one vendor to anocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r, or an application measured against its previous results, including new threat vectors found in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 wild? And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 real holy grail - how much money or how many customers do we stand to lose of a particular finding sticks around?

I've had this same rant over and over and over. And believe me - my primary goal in documenting findings is documenting cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m in such a way that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 individual problems get fixed. But management makes decisions based on metrics. Managers deal with many, many, many facets of production, so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need things abstracted. They could really care less about how many reflected XSS flaws cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are versus persisted - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y want to know how much money cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're gonna lose if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't fix it, and how much money it's gonna cost cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m to fix it. (See Applying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Formula.)

I've tried to use things to measure between applications like, flaws found per use-case, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n not every application has proper use-case analysis (/sigh). And measuring an application over time means that new threats will be involved in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 new test - so an application reviewed a year ago, with NO changes, will actually have MORE findings this year - because new ways to hack have been documented.

I love sports - and particularly because of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 statistics cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y use. I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 basis of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir statistics, though, are that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y document so many events. I think cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 starting point for us is to start documenting more than cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerabilities cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365mselves, so that maybe we can start to put things togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r.

More Rude Awakening

Link

Well, I don't have many good answers yet, but a few ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r things that work against us:

  • Things like application firewalls (I have lots of problems with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m, this is one) ultimately tell cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developers that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y don't have to write good code.
  • When you do a search for Cross-site Scripting or XSS, you'll find a million examples of things like MySpace that allow you to do HTML. The fixes are always more input validation. For 90% of applications out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, output filtering is a more complete solution.
  • The proposed fixes from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools are generic, not specific to a developer's framework.
  • The proposed fixes from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools are often wrong because cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y're generic. (Case in point, SQL Injection is best fixed by business-rule input validation, and parameterized queries/prepared statements. The problem, however, is that those are platform specific, whereas saying to escape apostrophes isn't.)
  • The solutions widely on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 internet are also wrong or at best, incomplete.
  • It's rare to find somebody who is both a security expert and an app expert. It's even more rare to find somebody who is both of those and is able to clearly translate our very technical jargon into terms that adequately describe what we find yet are still "accessible".
  • The automated tools identify problems, but don't enforce solutions.
I've only managed to come up with a few ways for us to defend ourselves:
  • One benefit that we can provide that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 automated tools cannot is that those of us who stay in touch with development can more adequately help developers to find solutions that are specific to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir implementation. This is probably our biggest benefit over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 automated tools besides being able to find logic flaws and "cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r 10%".
  • In those occasions where we get to show of our skills, our exploit documentation can have really good shock-and-awe scenarios. Don't pop a message box with 'XSS' in it, show a multi-step process of an ordinary user logging into a hacker site with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir credentials to your app. Show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacker getting products for free. Do some Photoshop magic and put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim company's name on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 front page of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Wall Street Journal.
  • Those of you who are really good, widely-respected, and are able to communicate clearly (you know who you are), be more vocal. When developers do a search for ([XC]SRF|Session Riding), cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y'll be more effective when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y see cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 good solutions out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re, which is something cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 automated tools simply can't provide (not that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y truly find it yet, anyhow).
  • Be sure to document cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dangers of logic flaws. Emphasize those over cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 semantic flaws. The logic flaws are cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 human difference. Really document well those things that make cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 manual process great - cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 human intelligence required to discern a good privilege escalation/jumping attack, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 dangers of showing too much information, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 results of key exposure.
When sites get attacked, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 attacks that work are going to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 ones methodically worked out by a person, not a tool. We need to be able to show that we're able to apply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same type of analysis as people as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 bad guys do. Intuition is something cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools simply can't provide - we need to be able to sell that to our customers.

A Rude Awakening

Because of some recent events, it has occurred to me that my recent post about Making Security Rewarding, which included some information about metrics was not complete.

Not only will we as Web Application Security Experts soon come to a point where we must have a way to prove our value eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r monetarily or in image or time lost, etc., we must also learn to speak two languages.

There are lots of really great experts on Web Application Security. And if you read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir sites, read cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 trade mags, go to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 conferences and such, you're familiar with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 lingo. You know all cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alphabet soup. And if you're a web developer, it doesn't take long for one of us to translate flaws found into a language you can understand.

However, if you're in a consulting business, you have to sell your services to a level of people who have far more to worry about than web application security. The folks you're selling your services to don't know cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 alphabet soup, don't understand web application architecture, and unless you're a little lucky, might not even know what phishing is.

Same goes if you're in a corporation where application security is not cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 business's core competency. You're probably reporting to a manager who knows something about security in general, or about application development in general, so you can probably "justify your existence" to your manager, but how do you justify yourself to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir manager?

What adds to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 challenge is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 space that help with cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Low Hanging Fruit (LHF) promise to be able to find 100% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 very types of vulnerabilities that we experts spend a great deal of time finding manually. And cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n to complicate matters worse, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are tools made for protecting security that promise to eliminate 100% of web application vulnerabilities or 100% of fraud. And as long as that vendor gets to define what is meant by "web application vulnerabilities" or "fraud", cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y just might.

I'm not sure I've made that last point clear. Maybe a hypocá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365tical will make more sense:

Suppose a particular application firewall promises to eliminate all your web application security flaws. That product will be sold to a level of management that might not truly understand web applications or security. But with a promise like that, and some sexy dog-and-pony shows, many socks will be knocked off. So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n you as an expert, who use a few tools, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most important of your tools is cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 human brain - your own intuition, you have to make a promise that supersedes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 promise of a vendor. To boot, your price structure is probably far more expensive because you're not using a resalable widget, you're selling a one-time, manual process that takes real experts to accomplish.

So how do we prove our worth? And how do we do it with a competing market that uses cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same diluted (I mean, abstracted so cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 customer understands better what we provide - don't look behind cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 curtain!) terminology that we use? And how do we compare apples to apples with those automated tools without saying to our customers "you just don't understand what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y sold you"? I really don't know.

The only value add that I can think of is that if your organization also has people who've been developers, and who stay up-to-speed on current development technologies, you have an additional benefit in that you can communicate real solutions to real developers, not just real findings.

What scares me about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 low-hanging-fruit problem is that we have to be able to justify to whomever cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 additional manual resources required to find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remaining 10%. When you look at sheer numbers, I would suspect that a moderately-complex web application with no concern initially for security may have on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 order of 100 semantic flaws. The tools cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendors sell (for really cheap) will get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 90% of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 LHF. Our really expensive processes might find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 remaining 10% (or some subset, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365reof). That remaining 10% may be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most dangerous, but to somebody who isn't intimately aware of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 value of that remaining 10%, it's just 10 remaining flaws - no big deal (and that's assuming you have cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 opportunity to show cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 customer what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tool missed).

I hate to say it, but as much as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 tools are helping us to do our job, because we can't apply real money-saving metrics to our work, and we can't differentiate our lingo from cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendors, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vendors may squeeze us out of our very own space. For example, XSRF is a purely logical flaw. However, I'm aware of at least one application scanner that mis-categorizes a URL injection flaw as XSRF. So cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y can put in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir sales sheet that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y find cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 buzzword of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 week, when it indeed isn't true.

20070116

[XC]SRF FAQ

Link

CGI Security has released an FAQ on XSRF. Nothing that hasn't been said elsewhere, except that it originated in 1988 as a "Confused Deputy" problem. While it's mostly accurate, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 XMLHttpRequest examples are misleading. Except for flaws in specific browser protection mechanisms, you can't do XMLHttpRequest across domains, but cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's nothing on that sample that says that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 fraudulent code would have to be on cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same site, meaning cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 vulnerable site also has HTML Injection flaws.

The good news is, as incomplete as it is, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir proposed solution seems to be cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 most popular one - request tokens.

OWASP CSRF Java EE filter

Link

I have not tested this out yet, so please test before you implement it.

I think it's a really good idea to implement [XC]SRF fixing at a filter level. If this works, it's really kind of a thing of beauty because it takes cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 requirement for token generation and such out of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 hands of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer. The downside is that now cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementors will be required to apply cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 filter to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 right URI's - this won't work for everything.

The way it works is on responses, it finds any tags, and adds a hidden form element with a new token. The same token is stored in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session. On requests, if cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re's a token in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session, and cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request eicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r doesn't contain a token or it doesn't match cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 token in cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 session, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365n cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 user is shown an error page. This works exactly cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 same way as cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Struts token system works, except in Struts it's up to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 developer to use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 Token system when cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y need it.

If I get some cycles to test this out, I'll let you know. The thing that's concerning is that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re may be times that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 request doesn't get put togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r by using a form (delete.do?id=1382, for example). You'll need to be careful about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 implementation uri.

20070109

Server Trust Violation

The more I think about common types of XSS and phishing attacks, and as I do more of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m during blackbox testing, my first goal is usually to get cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser to load malicious script off my site. The XSS hole usually doesn't have that big of a payload window, so it works out better for testing if I can just use an editor to do a great deal of scripting.

On a completely unrelated (I'll put cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m togecá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r in a minute) note, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re have been several cases of late where website A will include an image from website B. Racá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r than downloading cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image and giving credit for it, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y just reference cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image directly from B. webmaster@B gets really mad at webmaster@A, so webmaster@B replaces cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 image with something naughty, so users of A see something cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y really weren't expecting making webmaster@A look really bad.

And on a third completely unrelated note, cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re are lots of public script libraries out cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365re. And many of cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m ask that you use cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365m by including cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 URL back to cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365ir site. The most common ones use information from your account at cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 script provider site in a dynamically-created script.

What's interesting about cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365se three cases is that neicá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365r cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser, nor cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 web server has any way of verifying cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 identity of what cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365y pulled in. The place where I see this being most annoying is in phishing attacks. I use site A to load script of attacker site B, into cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 victim's browser. There's nothing in place that says that A can't include script from site B. Now, I have no problem with A legitimately including script loaded from B - but in this case, A didn't REALLY want it.

Should we push for something like robots.txt or favicon.ico - something that cá cược thể thao bet365_cách nạp tiền vào bet365_ đăng ký bet365 browser will load automatically from a requested domain that includes a whitelist of directly-loaded resources? So if refwhitelist.txt doesn't include B, any scripts (images, css, etc.) from B aren't loaded?

I should probably flesh such ideas out more before publishing, but if you become rich and famous for making a better idea public, be sure to throw me a bone.