|
| andrei wrote:
| A lot of folks we talk to think fuzzing is only useful for
| finding memory leaks in C++ programs, so we wanted to show how
| adding a single fuzz test to your API can find SQL injection and
| other logic bugs.
|
| Would love to hear others' experience with Go fuzzing now that
| it's been out for a few months.
| Thaxll wrote:
| Fuzzing network protocol is a good usecase.
| intelVISA wrote:
| Fuzzing everything is absolutely essential imo.
| spullara wrote:
| People are still constructing SQL statements using user provided
| data? Have they never used prepared statements before?
| pjmlp wrote:
| Yes they are,
|
| https://www.trendmicro.com/en_gb/devops/21/k/overview-owasp-...
| kkirsche wrote:
| The problem I run into at work is developers learn ORMs in many
| situations before they learn SQL itself. As a result, many are
| used to ORMs which can do this for them via parameterization or
| they simply were never exposed to them. Whether it's good or
| bad, right or wrong, we've found that ensuring certain concepts
| are shared across all developers via a team onboarding training
| trumps the inconvenience when they already know these.
| henvic wrote:
| I'm afraid that even on the Go ecosystem you'll find people
| relying on ORMs that doesn't even use server-side prepared
| statements, but escapes queries -\\_(tsu)_/-
|
| bun, I'm looking at you...
|
| * IMHO there is not even any good reason to use an ORM
| whatsoever (unless, perhaps, you're building something very
| very very very very specific that needs to deal with very very
| very generic data).
| oefrha wrote:
| Looks more like a contrived example to me:
| h.db.Exec(fmt.Sprintf("insert into users(name, email,
| phone_number) values ('%s', '%s', '%s');",
| request.Name, request.Email, request.PhoneNumber))
|
| Any database driver including database/sql will support
| h.db.Exec("insert into users(name, email, phone_number) values
| (?, ?, ?);", request.Name, request.Email,
| request.PhoneNumber)
|
| which is shorter and more natural. They're throwing in a
| fmt.Sprintf in there for no reason other than forcing a tired
| old SQL injection.
|
| Now, shitty HTML templating causing injection with unsanitized
| user input is a lot more realistic, since the golang templating
| story isn't great.
|
| Edit: "templating" -> "HTML templating".
| evmunro wrote:
| You're right, it's likely that almost nobody is using
| `fmt.Sprintf` to build SQL queries in production.
|
| Templating and `fmt.Sprintf` are essentially the same thing
| in this context - `Sprintf` just gets the point across in
| fewer lines of code, and allows people to come up with
| realistic scenarios themselves.
| oefrha wrote:
| I'm talking about HTML templating, not templating SQL
| statements.
| jrockway wrote:
| It doesn't really matter that it's contrived. It's hard to
| show the value of something in a large system, because 90% of
| the blog post will be understanding that large system. So you
| have to pick something that is immediately obviously wrong,
| and let the reader make the jump to how this would actually
| be useful in the context of their own larger system.
|
| Even then, the approach of "just do it right the first time"
| is fallible. People have varying degrees of experience, and
| people have brain farts and type the wrong thing instead of
| the write thing. Your job as the technical lead is to have
| some sort of process in place to catch these things before
| they become security disasters. "Sorry, our junior engineer
| didn't know about prepared statements," is not something you
| want to tell your customers whose data was exfiltrated. The
| current industry standard here would be "cross your fingers
| and hope for the best", and that's why everyone knows your
| social security number and have opened 6 credit cards in your
| name. Fuzzing is another layer of sanity checking, on top of
| static analysis (where I think this issue should be caught),
| code reviews, and just typing in the correct code in the
| first place.
|
| At the end of the day, this just another example of how you
| could use fuzzing to detect problems that other things
| missed. That's valuable, as even with 100% code coverage and
| turning on all the lint checks, software still has bugs.
| Here's a tool that can help reduce the bug count.
| KingOfCoders wrote:
| Yes, it feels dated since JDBC brought prepared statements into
| the mainstream literally decades ago. Though I have seen this
| still happening from marketing hiring external marketing
| agencies to write some small apps for them, e.g. a web game for
| grabbing email addresses. Hopefully they don't have access to
| your main database (though I have seen this in startups too,
| because fast,fast,fast).
| pjmlp wrote:
| ODBC, ADO and Perl DBI did it even earlier.
| andrei wrote:
| It's much more common than you may think - especially at larger
| organizations where engineers go "off-script" frequently.
|
| That being said, we wanted to highlight an example of how
| fuzzing can be applied to a typical (albeit, toy) API to find
| logic bugs, and figured SQL Injection would be something that
| resonated with most (all?) developers.
| KingOfCoders wrote:
| Is there a open source fuzzing framework for Go?
| andrei wrote:
| As of go 1.18, fuzzing is built into the toolchain itself, and
| is what we're using in this post.
|
| We go over the basics here [0], if you'd like to start at the
| beginning
|
| [0]: https://blog.fuzzbuzz.io/go-fuzzing-basics/
| KingOfCoders wrote:
| Great, will take a look!
___________________________________________________________________
(page generated 2022-08-31 23:01 UTC) |