This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Difference between revisions of "Injection Prevention Cheat Sheet"
m (ddd) (Tag: Visual edit) |
m (sdfs) (Tag: Visual edit) |
||
Line 48: | Line 48: | ||
!Description | !Description | ||
!How to test for the issue | !How to test for the issue | ||
− | |||
!Remediation | !Remediation | ||
!Example code - Java | !Example code - Java | ||
Line 59: | Line 58: | ||
* '''Out-of-band:''' data is retrieved using a different channel (e.g., an email with the results of the query is generated and sent to the tester). | * '''Out-of-band:''' data is retrieved using a different channel (e.g., an email with the results of the query is generated and sent to the tester). | ||
* '''Inferential or Blind:''' there is no actual transfer of data, but the tester is able to reconstruct the information by sending particular requests and observing the resulting behavior of the DB Server. | * '''Inferential or Blind:''' there is no actual transfer of data, but the tester is able to reconstruct the information by sending particular requests and observing the resulting behavior of the DB Server. | ||
− | |'''Automated Exploitation''' | + | |'''During code review''' |
+ | please check for any queries to the database are not done via prepared statements. | ||
+ | |||
+ | If dynamic statements are being made please check if the data is sanitized before used as par of the statement. | ||
+ | |||
+ | Auditors should always look for uses of sp_execute, execute or exec within SQL Server stored procedures. Similar audit guidelines are necessary for similar functions for other vendors. | ||
+ | |||
+ | '''Automated Exploitation''' | ||
+ | |||
Most of the situation and techniques below here can be performed in a automated way using some tools. In this article the tester can find information how to perform an automated auditing using SQLMap: | Most of the situation and techniques below here can be performed in a automated way using some tools. In this article the tester can find information how to perform an automated auditing using SQLMap: | ||
Line 81: | Line 88: | ||
This technique is very useful when the tester find a Blind SQL Injection situation, in which nothing is known on the outcome of an operation. The technique consists of the use of DBMS functions to perform an out of band connection and deliver the results of the injected query as part of the request to the tester’s server. Like the error based techniques, each DBMS has its own functions. Check for specific DBMS section. | This technique is very useful when the tester find a Blind SQL Injection situation, in which nothing is known on the outcome of an operation. The technique consists of the use of DBMS functions to perform an out of band connection and deliver the results of the injected query as part of the request to the tester’s server. Like the error based techniques, each DBMS has its own functions. Check for specific DBMS section. | ||
− | |||
− | |||
− | |||
− | |||
|<u>'''Defense Option 1: Prepared Statements (with Parameterized Queries)'''</u> | |<u>'''Defense Option 1: Prepared Statements (with Parameterized Queries)'''</u> | ||
Line 121: | Line 124: | ||
!Description | !Description | ||
!How to test for the issue | !How to test for the issue | ||
− | |||
!Remediation | !Remediation | ||
!Example code - Java | !Example code - Java | ||
Line 127: | Line 129: | ||
|LDAP Injection | |LDAP Injection | ||
| | | | ||
− | |||
LDAP Injection is an attack used to exploit web based applications that construct LDAP statements based on user input. When an application fails to properly sanitize user input, it’s possible to modify LDAP statements through techniques similar to [[SQL Injection]]. LDAP injection attacks could result in the granting of permissions to unauthorized queries, and content modification inside the LDAP tree. For more information on LDAP Injection attacks, visit [[LDAP injection]]. | LDAP Injection is an attack used to exploit web based applications that construct LDAP statements based on user input. When an application fails to properly sanitize user input, it’s possible to modify LDAP statements through techniques similar to [[SQL Injection]]. LDAP injection attacks could result in the granting of permissions to unauthorized queries, and content modification inside the LDAP tree. For more information on LDAP Injection attacks, visit [[LDAP injection]]. | ||
Line 133: | Line 134: | ||
# The lack of safer, parameterized LDAP query interfaces | # The lack of safer, parameterized LDAP query interfaces | ||
# The widespread use of LDAP to authenticate users to systems. | # The widespread use of LDAP to authenticate users to systems. | ||
− | |||
| | | | ||
|'''<u>Escape all variables using the right LDAP encoding function</u>''' | |'''<u>Escape all variables using the right LDAP encoding function</u>''' | ||
Line 187: | Line 187: | ||
!Description | !Description | ||
!How to test for the issue | !How to test for the issue | ||
− | |||
!Remediation | !Remediation | ||
!Example code - Java | !Example code - Java | ||
Line 200: | Line 199: | ||
Equally Static Code Analysis tools check the data flow of untrusted user input into a web application and check if the data is then entered into a dangerous method which executes the user input as a command. | Equally Static Code Analysis tools check the data flow of untrusted user input into a web application and check if the data is then entered into a dangerous method which executes the user input as a command. | ||
− | | | + | |'''During code review''', check if any command execute methods are called and in unvalidated user input are taken as data for that command. |
− | |||
− | If the | + | Out side of that, appending a semicolon to the end of a URL query parameter followed by an operating system command, will execute the command. %3B is url encoded and decodes to semicolon. This is because the ; is interpreted as a command separator. |
+ | '''Example:''' http://sensitive/something.php?dir=%3Bcat%20/etc/passwd | ||
+ | |||
+ | If the application responds with the output of the /etc/passwd file then you know the attack has been successful. Many web application scanners can be used to test for this attack as they inject variations of command injections and test the response. | ||
− | + | Equally '''Static Code Analysis''' tools check the data flow of untrusted user input into a web application and check if the data is then entered into a dangerous method which executes the user input as a command. | |
− | |||
− | |||
|If it is considered unavoidable the call to a system command incorporated with user-supplied, the following two layers of defense should be used within software in order to prevent attacks | |If it is considered unavoidable the call to a system command incorporated with user-supplied, the following two layers of defense should be used within software in order to prevent attacks | ||
# '''Parametrization''' - If available, use structured mechanisms that automatically enforce the separation between data and command. These mechanisms can help to provide the relevant quoting, encoding. | # '''Parametrization''' - If available, use structured mechanisms that automatically enforce the separation between data and command. These mechanisms can help to provide the relevant quoting, encoding. |
Revision as of 16:28, 14 November 2017
Last revision (mm/dd/yy): 11/14/2017
IntroductionThis article is focused on providing clear, simple, actionable guidance for preventing the entire category of Injection flaws in your applications. Injection attacks, especially SQL Injection, are unfortunately very common. Application accessibility is a very important factor in protection and prevention of injection flaws. Only the minority of all applications within a company/enterprise are developed in house, where as most applications are from external sources. Open source applications give at least the opportunity to fix problems, but closed source applications need a different approach to injection flaws. Injection flaws occur when an application sends untrusted data to an interpreter. Injection flaws are very prevalent, particularly in legacy code, often found in SQL queries, LDAP queries, XPath queries, OS commands, program arguments, etc. Injection flaws are easy to discover when examining code, but more difficult via testing. Scanners and fuzzers can help attackers find them. Depending on the accessibility different actions must be taken in order to fix them. It is always the best way to fix the problem in source code itself, or even redesign some parts of the applications. But if the source code is not available or it is simply uneconomical to fix legacy software only virtual patching makes sense. Application TypesThree classes of applications can usually be seen within a company. Those 3 types are needed to identify the actions which need to take place in order to prevent/fix injection flaws. A1: New ApplicationA new web application in the design phase, or in early stage development. A2: Productive Open Source ApplicationAn already productive application, which can be easily adapted. A Model-View-Controller (MVC) type application is just one example of having a easily accessible application architecture. A3: Productive Closed Source ApplicationA productive application which cannot or only with difficulty be modified. Forms of InjectionThere are several forms of injection targeting different technologies including SQL queries, LDAP queries, XPath queries and OS commands. Query languagesThe most famous form of injection is SQL Injection where an attacker can modify existing database queries. For more information see the SQL Injection Prevention Cheat Sheet. But also LDAP, SOAP, XPath and REST based queries can be susceptible to injection attacks allowing for data retrieval or control bypass. SQL Injection
LDAP Injection
XPath Injection
Scripting languagesAll scripting languages used in web applications have a form of an eval call which receives code at runtime and executes it. If code is crafted using unvalidated and unescaped user input code injection can occur which allows an attacker to subvert application logic and eventually to gain local access. Every time a scripting language is used, the actual implementation of the 'higher' scripting language is done using a 'lower' language like C. If the scripting language has a flaw in the data handling code 'Null Byte Injection' attack vectors can be deployed to gain access to other areas in memory, which results in a successful attack. Operating System (OS) CommandsApplication developers sometimes implement operating system interactions using calls to system utilities to create and remove directories for example. Here unescaped input can lead to arbitrary OS commands being executed.
Network ProtocolsWeb applications often communicate with network daemons (like SMTP, IMAP, FTP) where user input becomes part of the communication stream. Here it is possible to inject command sequences to abuse an established session. Injection Prevention RulesRule #1 (Perform proper input validation):Perform proper input validation. Positive or “whitelist” input validation with appropriate canonicalization is also recommended, but is not a complete defense as many applications require special characters in their input. Rule #2 (Use a safe API):The preferred option is to use a safe API which avoids the use of the interpreter entirely or provides a parameterized interface. Be careful of APIs, such as stored procedures, that are parameterized, but can still introduce injection under the hood. Rule #3 (Contextually escape user data):If a parameterized API is not available, you should carefully escape special characters using the specific escape syntax for that interpreter. Other Injection Cheatsheets SQL Injection Prevention Cheat Sheet Other Cheatsheets |