SQL injection

Last updated

A classification of SQL injection attacking vector as of 2010 KD SQLIA Classification 2010.png
A classification of SQL injection attacking vector as of 2010

In computing, SQL injection is a code injection technique used to attack data-driven applications, in which malicious SQL statements are inserted into an entry field for execution (e.g. to dump the database contents to the attacker). [1] [2] SQL injection must exploit a security vulnerability in an application's software, for example, when user input is either incorrectly filtered for string literal escape characters embedded in SQL statements or user input is not strongly typed and unexpectedly executed. SQL injection is mostly known as an attack vector for websites but can be used to attack any type of SQL database.

Contents

SQL injection attacks allow attackers to spoof identity, tamper with existing data, cause repudiation issues such as voiding transactions or changing balances, allow the complete disclosure of all data on the system, destroy the data or make it otherwise unavailable, and become administrators of the database server. Document-oriented NoSQL databases can also be affected by this security vulnerability. [3]

In a 2012 study, it was observed that the average web application received four attack campaigns per month, and retailers received twice as many attacks as other industries. [4]

History

Discussions of SQL injection, such as a 1998 article in Phrack Magazine, began in the late 1990s. [5] SQL injection was considered one of the top 10 web application vulnerabilities of 2007 and 2010 by the Open Web Application Security Project. [6] In 2013, SQL injection was rated the number one attack on the OWASP top ten. [7]

Root cause

SQL Injection is a common security vulnerability that arises from letting attacker supplied data become SQL code. This happens when programmers assemble SQL queries either by string interpolation or by concatenating SQL commands with user supplied data. Therefore, injection relies on the fact that SQL statements consist of both data used by the SQL statement and commands that control how the SQL statement is executed. For example, in the SQL statement select*frompersonwherename='susan'andage=2 the string 'susan' is data and the fragment andage=2 is an example of a command (the value 2 is also data in this example).

SQL injection occurs when specially crafted user input is processed by the receiving program in a way that allows the input to exit a data context and enter a command context. This allows the attacker to alter the structure of the SQL statement which is executed.

As a simple example, imagine that the data 'susan' in the above statement was provided by user input. The user entered the string 'susan' (without the apostrophes) in a web form text entry field, and the program used string concatenation statements to form the above SQL statement from the three fragments select*frompersonwherename=', the user input of 'susan', and 'andage=2.

Now imagine that instead of entering 'susan' the attacker entered 'or1=1;--.

The program will use the same string concatenation approach with the 3 fragments of select*frompersonwherename=', the user input of 'or1=1;--, and 'andage=2 and construct the statement select*frompersonwherename=''or1=1;-- and age = 2. Many databases will ignore the text after the '--' string as this denotes a comment. The structure of the SQL command is now select*frompersonwherename=''or1=1; and this will select all person rows rather than just those named 'susan' whose age is 2. The attacker has managed to craft a data string which exits the data context and entered a command context.

Ways to exploit

Although the root cause of all SQL injections is the same, there are different techniques to exploit it. Some of them are discussed below:

Getting direct output or action

Imagine a program creates a SQL statement using the following string assignment command :

varstatement="SELECT * FROM users WHERE name = '"+userName+"'";

This SQL code is designed to pull up the records of the specified username from its table of users. However, if the "userName" variable is crafted in a specific way by a malicious user, the SQL statement may do more than the code author intended. For example, setting the "userName" variable as:

' OR '1'='1

or using comments to even block the rest of the query (there are three types of SQL comments [8] ). All three lines have a space at the end:

' OR '1'='1' -- ' OR '1'='1' { ' OR '1'='1' /* 

renders one of the following SQL statements by the parent language:

SELECT*FROMusersWHEREname=''OR'1'='1';
SELECT*FROMusersWHEREname=''OR'1'='1'-- ';

If this code were to be used in authentication procedure then this example could be used to force the selection of every data field (*) from all users rather than from one specific user name as the coder intended, because the evaluation of '1'='1' is always true.

The following value of "userName" in the statement below would cause the deletion of the "users" table as well as the selection of all data from the "userinfo" table (in essence revealing the information of every user), using an API that allows multiple statements:

a';DROPTABLEusers;SELECT*FROMuserinfoWHERE't'='t

This input renders the final SQL statement as follows and specified:

SELECT*FROMusersWHEREname='a';DROPTABLEusers;SELECT*FROMuserinfoWHERE't'='t';

While most SQL server implementations allow multiple statements to be executed with one call in this way, some SQL APIs such as PHP's mysql_query() function do not allow this for security reasons. This prevents attackers from injecting entirely separate queries, but doesn't stop them from modifying queries.

Blind SQL injection

Blind SQL injection is used when a web application is vulnerable to a SQL injection, but the results of the injection are not visible to the attacker. The page with the vulnerability may not be one that displays data but will display differently depending on the results of a logical statement injected into the legitimate SQL statement called for that page. This type of attack has traditionally been considered time-intensive because a new statement needed to be crafted for each bit recovered, and depending on its structure, the attack may consist of many unsuccessful requests. Recent advancements have allowed each request to recover multiple bits, with no unsuccessful requests, allowing for more consistent and efficient extraction. [9] There are several tools that can automate these attacks once the location of the vulnerability and the target information has been established. [10]

Conditional responses

One type of blind SQL injection forces the database to evaluate a logical statement on an ordinary application screen. As an example, a book review website uses a query string to determine which book review to display. So the URL https://books.example.com/review?id=5 would cause the server to run the query

SELECT*FROMbookreviewsWHEREID='5';

from which it would populate the review page with data from the review with ID 5, stored in the table bookreviews. The query happens completely on the server; the user does not know the names of the database, table, or fields, nor does the user know the query string. The user only sees that the above URL returns a book review. A hacker can load the URLs https://books.example.com/review?id=5' OR '1'='1 and https://books.example.com/review?id=5' AND '1'='2, which may result in queries

SELECT*FROMbookreviewsWHEREID='5'OR'1'='1';SELECT*FROMbookreviewsWHEREID='5'AND'1'='2';

respectively. If the original review loads with the "1=1" URL and a blank or error page is returned from the "1=2" URL, and the returned page has not been created to alert the user the input is invalid, or in other words, has been caught by an input test script, the site is likely vulnerable to an SQL injection attack as the query will likely have passed through successfully in both cases. The hacker may proceed with this query string designed to reveal the version number of MySQL running on the server: https://books.example.com/review?id=5ANDsubstring(@@version,1,INSTR(@@version,'.')-1)=4, which would show the book review on a server running MySQL 4 and a blank or error page otherwise. The hacker can continue to use code within query strings to achieve their goal directly, or to glean more information from the server in hopes of discovering another avenue of attack. [11] [12]

Second-order SQL injection

Second-order SQL injection occurs when an application only guards its SQL against immediate user input, but has a less strict policy when dealing with data already stored in the system. Therefore, although such application would manage to safely process the user input and store it without issue, it would store the malicious SQL statement as well. Then, when another part of that application would use that data in a query that isn't protected from SQL injection, this malicious statement might get executed. [13] This attack requires more knowledge of how submitted values are later used. Automated web application security scanners would not easily detect this type of SQL injection and may need to be manually instructed where to check for evidence that it is being attempted.

In order to protect from this kind of attack, all SQL processing must be uniformly secure, despite the data source.

Prevention/Mitigation

An SQL injection is a well known attack and easily prevented by simple measures. After an apparent SQL injection attack on TalkTalk in 2015, the BBC reported that security experts were stunned that such a large company would be vulnerable to it. [14] Techniques like pattern matching, software testing, and grammar analysis are some common ways to mitigate these attacks. [2]

Prevention measures listed further below can be summarized into a simple two-part checklist:

  1. Every variable data literal should be represented in the query by a special marker, and later bound to the query through a prepared statement
  2. Every other query part (such as keyword or database schema name) must be filtered through a whitelist

A simple example in PHP demonstrating usage of both rules:

$mysqli=newmysqli('hostname','db_username','db_password','db_name');$sort_column=$_GET['sort_column']??'name';// checking the column name against a whitelist:if(!in_array($sort_column,['name','birthday'],true)){thrownewInvalidArgumentException("Invalid sort column");}// using a parameter to represent the data value:$query="SELECT * FROM `users` WHERE `birthday` > ? ORDER BY `$sort_column`",// preparing SQL, binding the birthday value and executing the query:$result=$mysqli->execute_query($query,[$_GET['birthday']]);

This way, no malicious data will be able to make it into SQL.

String escaping

One of the traditional ways to prevent injections is to add every piece of data as a quoted string and escape all characters, that have special meaning in SQL strings, in that data. [15] The manual for an SQL DBMS explains which characters have a special meaning, which allows creating a comprehensive blacklist of characters that need translation. For instance, every occurrence of a single quote (') in a string parameter must be prepended with a backslash (\) so that the database understands the single quote is part of a given string, rather than its terminator. PHP's MySQLi module provides the mysqli_real_escape_string() function to escape strings according to MySQL semantics; in the following example the username is a string parameter, and therefore it can be protected by means of string escaping:

$mysqli=newmysqli('hostname','db_username','db_password','db_name');$query=sprintf("SELECT * FROM `Users` WHERE UserName='%s'",$mysqli->real_escape_string($username),$mysqli->query($query);

Depending solely on the programmer to diligently escape all string parameters presents inherent risks, given the potential for oversights in the process. To mitigate this vulnerability, programmers may opt to develop their own abstraction layers to automate the escaping of parameters. [16]

Besides, not every piece of data can be added to SQL as a string literal (MySQL's LIMIT clause arguments [17] or table/column names [18] for example) and in this case escaping string-related special characters will do no good whatsoever, leaving resulting SQL open to injections.

Object relational mappers

Object–relational mapping (ORM) frameworks such as Hibernate and ActiveRecord provide an object-oriented interface for queries over a relational database. Most, if not all, ORMs, automatically handle the escaping needed to prevent SQL injection attacks, as a part of the framework's query API. However, many ORMs provide the ability to bypass their mapping facilities and emit raw SQL statements; improper use of this functionality can introduce the possibility for an injection attack. [19]

Parameterized statements

With most development platforms, parameterized statements that work with parameters can be used (sometimes called placeholders or bind variables) instead of embedding user input in the statement. A placeholder can only store a value of the given type and not an arbitrary SQL fragment. Hence the SQL injection would simply be treated as a strange (and probably invalid) parameter value. In many cases, the SQL statement is fixed, and each parameter is a scalar, not a table. The user input is then assigned (bound) to a parameter. [20]

Pattern check

Integer, float, or Boolean string parameters can be checked to determine if their value is a valid representation of the given type. Strings that must adhere to a specific pattern or condition (e.g. dates, UUIDs, phone numbers) can also be checked to determine if said pattern is matched.

Database permissions

Limiting the permissions on the database login used by the web application to only what is needed may help reduce the effectiveness of any SQL injection attacks that exploit any bugs in the web application.

For example, on Microsoft SQL Server, a database logon could be restricted from selecting on some of the system tables which would limit exploits that try to insert JavaScript into all the text columns in the database.

denyselectonsys.sysobjectstowebdatabaselogon;denyselectonsys.objectstowebdatabaselogon;denyselectonsys.tablestowebdatabaselogon;denyselectonsys.viewstowebdatabaselogon;denyselectonsys.packagestowebdatabaselogon;

Examples

See also

Related Research Articles

Cross-site scripting (XSS) is a type of security vulnerability that can be found in some web applications. XSS attacks enable attackers to inject client-side scripts into web pages viewed by other users. A cross-site scripting vulnerability may be used by attackers to bypass access controls such as the same-origin policy. During the second half of 2007, XSSed documented 11,253 site-specific cross-site vulnerabilities, compared to 2,134 "traditional" vulnerabilities documented by Symantec. XSS effects vary in range from petty nuisance to significant security risk, depending on the sensitivity of the data handled by the vulnerable site and the nature of any security mitigation implemented by the site's owner network.

A stored procedure is a subroutine available to applications that access a relational database management system (RDBMS). Such procedures are stored in the database data dictionary.

In cryptography, a salt is random data fed as an additional input to a one-way function that hashes data, a password or passphrase. Salting helps defend against attacks that use precomputed tables, by vastly growing the size of table needed for a successful attack. It also helps protect passwords that occur multiple times in a database, as a new salt is used for each password instance. Additionally, salting does not place any burden on users.

Code injection is a class of computer security exploits in which vulnerable computer programs or system processes fail to correctly handle external data, such as user input, leading to the program misinterpreting the data as a command that should be executed. An attacker using this method "injects" code into the program while it is running. Successful exploitation of a code injection vulnerability can result in data breaches, access to restricted or critical computer systems, and the spread of malware.

A directory traversal attack exploits insufficient security validation or sanitization of user-supplied file names, such that characters representing "traverse to parent directory" are passed through to the operating system's file system API. An affected application can be exploited to gain unauthorized access to the file system.

<span class="mw-page-title-main">HTTP response splitting</span>

HTTP response splitting is a form of web application vulnerability, resulting from the failure of the application or its environment to properly sanitize input values. It can be used to perform cross-site scripting attacks, cross-user defacement, web cache poisoning, and similar exploits.

Taint checking is a feature in some computer programming languages, such as Perl, Ruby or Ballerina designed to increase security by preventing malicious users from executing commands on a host computer. Taint checks highlight specific security risks primarily associated with web sites which are attacked using techniques such as SQL injection or buffer overflow attack approaches.

A file inclusion vulnerability is a type of web vulnerability that is most commonly found to affect web applications that rely on a scripting run time. This issue is caused when an application builds a path to executable code using an attacker-controlled variable in a way that allows the attacker to control which file is executed at run time. A file include vulnerability is distinct from a generic directory traversal attack, in that directory traversal is a way of gaining unauthorized file system access, and a file inclusion vulnerability subverts how an application loads code for execution. Successful exploitation of a file inclusion vulnerability will result in remote code execution on the web server that runs the affected web application. An attacker can use remote code execution to create a web shell on the web server, which can be used for website defacement.

The MySQLi Extension is a relational database driver used in the PHP scripting language to provide an interface with MySQL protocol compatible databases.

Database activity monitoring is a database security technology for monitoring and analyzing database activity. DAM may combine data from network-based monitoring and native audit information to provide a comprehensive picture of database activity. The data gathered by DAM is used to analyze and report on database activity, support breach investigations, and alert on anomalies. DAM is typically performed continuously and in real-time.

Java Database Connectivity (JDBC) is an application programming interface (API) for the Java programming language which defines how a client may access a database. It is a Java-based data access technology used for Java database connectivity. It is part of the Java Standard Edition platform, from Oracle Corporation. It provides methods to query and update data in a database, and is oriented toward relational databases. A JDBC-to-ODBC bridge enables connections to any ODBC-accessible data source in the Java virtual machine (JVM) host environment.

<span class="mw-page-title-main">Apache Hive</span> Database engine

Apache Hive is a data warehouse software project. It is built on top of Apache Hadoop for providing data query and analysis. Hive gives an SQL-like interface to query data stored in various databases and file systems that integrate with Hadoop. Traditional SQL queries must be implemented in the MapReduce Java API to execute SQL applications and queries over distributed data.

Cross-site request forgery, also known as one-click attack or session riding and abbreviated as CSRF or XSRF, is a type of malicious exploit of a website or web application where unauthorized commands are submitted from a user that the web application trusts. There are many ways in which a malicious website can transmit such commands; specially-crafted image tags, hidden forms, and JavaScript fetch or XMLHttpRequests, for example, can all work without the user's interaction or even knowledge. Unlike cross-site scripting (XSS), which exploits the trust a user has for a particular site, CSRF exploits the trust that a site has in a user's browser. In a CSRF attack, an innocent end user is tricked by an attacker into submitting a web request that they did not intend. This may cause actions to be performed on the website that can include inadvertent client or server data leakage, change of session state, or manipulation of an end user's account.

In database management systems (DBMS), a prepared statement, parameterized statement, or parameterized query is a feature where the database pre-compiles SQL code and stores the results, separating it from data. Benefits of prepared statements are:

In July 2012, Yahoo Voice, a user-generated content platform owned by Yahoo, suffered a major data breach. On July 11, 2012, a hacking group calling itself "D33DS Company" posted a file online containing approximately 450,000 login credentials and passwords from Yahoo Voice users. The data was obtained through a SQL injection attack that exploited vulnerabilities in Yahoo's database servers.

Database encryption can generally be defined as a process that uses an algorithm to transform data stored in a database into "cipher text" that is incomprehensible without first being decrypted. It can therefore be said that the purpose of database encryption is to protect the data stored in a database from being accessed by individuals with potentially "malicious" intentions. The act of encrypting a database also reduces the incentive for individuals to hack the aforementioned database as "meaningless" encrypted data adds extra steps for hackers to retrieve the data. There are multiple techniques and technologies available for database encryption, the most important of which will be detailed in this article.

<span class="mw-page-title-main">NullCrew</span>

NullCrew was a hacktivist group founded in 2012 that took responsibility for multiple high-profile computer attacks against corporations, educational institutions, and government agencies.

XML External Entity attack, or simply XXE attack, is a type of attack against an application that parses XML input. This attack occurs when XML input containing a reference to an external entity is processed by a weakly configured XML parser. This attack may lead to the disclosure of confidential data, DoS attacks, server-side request forgery, port scanning from the perspective of the machine where the parser is located, and other system impacts.

In computer security, LDAP injection is a code injection technique used to exploit web applications which could reveal sensitive user information or modify information represented in the LDAP data stores. LDAP injection exploits a security vulnerability in an application by manipulating input parameters passed to internal search, add or modify functions. When an application fails to properly sanitize user input, it is possible for an attacker to modify an LDAP statement.

A web shell is a shell-like interface that enables a web server to be remotely accessed, often for the purposes of cyberattacks. A web shell is unique in that a web browser is used to interact with it.

References

  1. Microsoft. "SQL Injection". Archived from the original on August 2, 2013. Retrieved August 4, 2013. SQL injection is an attack in which malicious code is inserted into strings that are later passed to an instance of SQL Server for parsing and execution. Any procedure that constructs SQL statements should be reviewed for injection vulnerabilities because SQLi Server will execute all syntactically valid queries that it receives. Even parameterized data can be manipulated by a skilled and determined attacker.
  2. 1 2 Zhuo, Z.; Cai, T.; Zhang, X.; Lv, F. (April 2021). "Long short-term memory on abstract syntax tree for SQL injection detection". IET Software. 15 (2): 188–197. doi:10.1049/sfw2.12018. ISSN   1751-8806. S2CID   233582569.
  3. "Hacking NodeJS and MongoDB | Websecurify Blog" . Retrieved November 15, 2023.
  4. Imperva (July 2012). "Imperva Web Application Attack Report" (PDF). Archived from the original (PDF) on September 7, 2013. Retrieved August 4, 2013. Retailers suffer 2x as many SQL injection attacks as other industries. / While most web applications receive 4 or more web attack campaigns per month, some websites are constantly under attack. / One observed website was under attack 176 out of 180 days, or 98% of the time.
  5. Jeff Forristal (signing as rain.forest.puppy) (December 25, 1998). "NT Web Technology Vulnerabilities". Phrack Magazine . 8 (54 (article 8)). Archived from the original on March 19, 2014.
  6. "Category:OWASP Top Ten Project". OWASP. Archived from the original on May 19, 2011. Retrieved June 3, 2011.
  7. "Category:OWASP Top Ten Project". OWASP. Archived from the original on October 9, 2013. Retrieved August 13, 2013.
  8. "How to Enter SQL Comments" (PDF), IBM Informix Guide to SQL: Syntax, IBM, pp. 13–14, archived from the original (PDF) on February 24, 2021, retrieved June 4, 2018
  9. "Extracting Multiple Bits Per Request From Full-blind SQL Injection Vulnerabilities". Hack All The Things. Archived from the original on July 8, 2016. Retrieved July 8, 2016.
  10. "Using SQLBrute to brute force data from a blind SQL injection point". Justin Clarke. Archived from the original on June 14, 2008. Retrieved October 18, 2008.
  11. macd3v. "Blind SQL Injection tutorial". Archived from the original on December 14, 2012. Retrieved December 6, 2012.{{cite web}}: CS1 maint: numeric names: authors list (link)
  12. Andrey Rassokhin; Dmitry Oleksyuk. "TDSS botnet: full disclosure". Archived from the original on December 9, 2012. Retrieved December 6, 2012.
  13. "Oracle tutorial on SQL injection".
  14. "Questions for TalkTalk - BBC News". BBC News. October 26, 2015. Archived from the original on October 26, 2015. Retrieved October 26, 2015.
  15. "MySQL String Literals".
  16. "Transparent query layer for MySQL". Robert Eisele. November 8, 2010.
  17. "MySQL SELECT Statement".
  18. "MySQL Schema Object Names".
  19. "SQL Injection Attacks & Prevention: Complete Guide". appsecmonkey.com. February 13, 2021. Retrieved February 24, 2021.
  20. "SQL Injection Prevention Cheat Sheet". Open Web Application Security Project. Archived from the original on January 20, 2012. Retrieved March 3, 2012.
  21. "Guesswork Plagues Web Hole Reporting". SecurityFocus. March 6, 2002. Archived from the original on July 9, 2012.
  22. "WHID 2005-46: Teen uses SQL injection to break to a security magazine web site". Web Application Security Consortium. November 1, 2005. Archived from the original on January 17, 2010. Retrieved December 1, 2009.
  23. "WHID 2006-3: Russian hackers broke into a RI GOV website". Web Application Security Consortium. January 13, 2006. Archived from the original on February 13, 2011. Retrieved May 16, 2008.
  24. "Anti-U.S. Hackers Infiltrate Army Servers". Information Week. May 29, 2009. Archived from the original on December 20, 2016. Retrieved December 17, 2016.
  25. Alex Papadimoulis (April 15, 2008). "Oklahoma Leaks Tens of Thousands of Social Security Numbers, Other Sensitive Data". The Daily WTF. Archived from the original on May 10, 2008. Retrieved May 16, 2008.
  26. "US man 'stole 130m card numbers'". BBC. August 17, 2009. Archived from the original on August 18, 2009. Retrieved August 17, 2009.
  27. "The pirate bay attack". July 7, 2010. Archived from the original on August 24, 2010.
  28. "Did Little Bobby Tables migrate to Sweden?". Alicebobandmallory.com. Archived from the original on July 1, 2012. Retrieved June 3, 2011.
  29. "Royal Navy website attacked by Romanian hacker". BBC News. November 8, 2010. Archived from the original on November 9, 2010. Retrieved November 15, 2023.
  30. Sam Kiley (November 25, 2010). "Super Virus A Target For Cyber Terrorists". Archived from the original on November 28, 2010. Retrieved November 25, 2010.
  31. "Hacker breaks into Barracuda Networks database". Archived from the original on July 27, 2011.
  32. "site user password intrusion info". Dslreports.com. Archived from the original on October 18, 2012. Retrieved June 3, 2011.
  33. "DSLReports says member information stolen". Cnet News. April 28, 2011. Archived from the original on March 21, 2012. Retrieved April 29, 2011.
  34. "DSLReports.com breach exposed more than 100,000 accounts". The Tech Herald. April 29, 2011. Archived from the original on April 30, 2011. Retrieved April 29, 2011.
  35. "LulzSec hacks Sony Pictures, reveals 1m passwords unguarded", electronista.com, June 2, 2011, archived from the original on June 6, 2011, retrieved June 3, 2011
  36. "Imperva.com: PBS Hacked - How Hackers Probably Did It". Archived from the original on June 29, 2011. Retrieved July 1, 2011.
  37. Ngak, Chenda. "Yahoo reportedly hacked: Is your account safe?". CBS News . Archived from the original on July 14, 2012. Retrieved July 16, 2012.
  38. Yap, Jamie (July 12, 2012). "450,000 user passwords leaked in Yahoo breach". ZDNet. Archived from the original on July 2, 2014. Retrieved February 18, 2017.
  39. Perlroth, Nicole (October 3, 2012). "Hackers Breach 53 Universities and Dump Thousands of Personal Records Online". New York Times. Archived from the original on October 5, 2012.
  40. Kovacs, Eduard (November 4, 2013). "Hackers Leak Data Allegedly Stolen from Chinese Chamber of Commerce Website". Softpedia News. Archived from the original on March 2, 2014. Retrieved February 27, 2014.
  41. Damon Poeter. 'Close-Knit' Russian Hacker Gang Hoards 1.2 Billion ID Creds Archived July 14, 2017, at the Wayback Machine , PC Magazine, August 5, 2014
  42. Nicole Perlroth. Russian Gang Amasses Over a Billion Internet Passwords Archived February 27, 2017, at the Wayback Machine , The New York Times, August 5, 2014.
  43. "TalkTalk gets record £400,000 fine for failing to prevent October 2015 attack". October 5, 2016. Archived from the original on October 24, 2016. Retrieved October 23, 2016.
  44. Goodin, Dan (March 2, 2021). "Rookie coding mistake prior to Gab hack came from site's CTO". Ars Technica.
  45. Goodin, Dan (March 8, 2021). "Gab, a haven for pro-Trump conspiracy theories, has been hacked again". Ars Technica.
  46. Munroe, Randall. "XKCD: Exploits of a Mom". Archived from the original on February 25, 2013. Retrieved February 26, 2013.
  47. "The Bobby Tables Guide to SQL Injection". September 15, 2009. Archived from the original on November 7, 2017. Retrieved October 30, 2017.
  48. "Jego firma ma w nazwie SQL injection. Nie zazdrościmy tym, którzy będą go fakturowali ;)". Niebezpiecznik (in Polish). September 11, 2014. Archived from the original on September 24, 2014. Retrieved September 26, 2014.