View Categories

SQL Injection

6 min read

SQL Injection – SQL Оруулга #

SQL injection is a code injection technique that might destroy your database.

SQL оруулга нь өгөгдлийн санг сүйтгэж болох кодын оруулах техник юм.

SQL injection is one of the most common web hacking techniques.

SQL оруулга нь хамгийн түгээмэл вэб хакердах техникүүдийн нэг юм.

SQL injection is the placement of malicious code in SQL statements, via web page input.

SQL оруулга нь вэб хуудсын оролтоор дамжуулан SQL өгүүлбэрт хорлонтой код байрлуулах явдал юм.


SQL in Web Pages – Вэб Хуудас дахь SQL #

SQL injection usually occurs when you ask a user for input, like their username/userid, and instead of a name/id, the user gives you an SQL statement that you will unknowingly run on your database.

SQL оруулга ихэвчлэн та хэрэглэгчийг сайт даа нэвтрүүлэх үед, жишээлбэл тэдний хэрэглэгчийн нэр/ID, хэрэглэгч нэр/ID-ний оронд SQL өгүүлбэр өгөх үед тохиолддог бөгөөд та үүнийг мэдэлгүйгээр өгөгдлийн сан дээрээ ажиллуулна.

Look at the following example which creates a SELECT statement by adding a variable (txtUserId) to a select string. The variable is fetched from user input (getRequestString):

Доорх жишээг хараарай, энэ нь сонгох мөрөнд хувьсагч (txtUserId) нэмснээр SELECT өгүүлбэр үүсгэнэ. Хувьсагчийг хэрэглэгчийн оролтоос (getRequestString) авна:

Example – Жишээ #

txtUserId = getRequestString(“UserId”);
txtSQL = “SELECT * FROM Users WHERE UserId = ” + txtUserId;

The rest of this chapter describes the potential dangers of using user input in SQL statements.

Энэ бүлгийн үлдсэн хэсэгт SQL өгүүлбэрт хэрэглэгчийн оролт ашиглах боломжит аюулуудыг тайлбарлана.


SQL Injection Based on 1=1 is Always True – 1=1 дээр үндэслэсэн SQL Оруулга нь үргэлж үнэн байдаг #

Look at the example above again. The original purpose of the code was to create an SQL statement to select a user, with a given user id.

Дээрх жишээг дахин хараарай. Кодын анхны зорилго нь өгөгдсөн хэрэглэгчийн id-тай хэрэглэгчийг сонгох SQL өгүүлбэр үүсгэх явдал байв.

If there is nothing to prevent a user from entering “wrong” input, the user can enter some “smart” input like this:

Хэрэв хэрэглэгчийг “буруу” оролт оруулахаас сэргийлэх зүйл байхгүй бол хэрэглэгч дараах “ухаалаг” оролт оруулж болно:

UserId: 

Then, the SQL statement will look like this:

Тэгвэл SQL өгүүлбэр дараах байдлаар харагдана:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

The SQL above is valid and will return ALL rows from the “Users” table, since OR 1=1 is always TRUE.

Дээрх SQL нь хүчинтэй бөгөөд OR 1=1 нь үргэлж үнэн байдаг тул “Хэрэглэгчид” хүснэгтийн бүх мөрийг буцаана.

Does the example above look dangerous? What if the “Users” table contains names and passwords?

Дээрх жишээ аюултай харагдаж байна уу? Хэрэв “Хэрэглэгчид” хүснэгтэд нэрс болон нууц үгүүдийг агуулж байвал яах вэ?

The SQL statement above is much the same as this:

Дээрх SQL өгүүлбэр нь дараахтай адил юм:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

A hacker might get access to all the user names and passwords in a database, by simply inserting 105 OR 1=1 into the input field.

Хакер 105 OR 1=1-г оролтын талбарт оруулснаар өгөгдлийн сан дахь бүх хэрэглэгчийн нэр болон нууц үгүүдэд нэвтрэх боломжтой.

SQL Injection Based on “”=”” is Always True – “”=”” дээр үндэслэсэн SQL Оруулга нь үргэлж үнэн байдаг #

Here is an example of a user login on a web site:

Энд вэб сайтад хэрэглэгчийн нэвтрэлтийн жишээ байна:

Нэвтрэх нэр:

Нууц үг:

Example – Жишээ #

uName = getRequestString(“username”);
uPass = getRequestString(“userpassword”);
 

sql = ‘SELECT * FROM Users WHERE Name =”‘ + uName + ‘” AND Pass =”‘ + uPass + ‘”‘

Result – Үр дүн #

SELECT * FROM Users WHERE Name =“John Doe” AND Pass =“myPass”

A hacker might get access to user names and passwords in a database by simply inserting ” OR “”=” into the user name or password text box:

Хакер ” OR “”=”-г хэрэглэгчийн нэр эсвэл нууц үгийн текст хайрцагт оруулснаар өгөгдлийн сан дахь хэрэглэгчийн нэр болон нууц үгүүдэд нэвтрэх боломжтой:

Хэрэглэгч нэр:

Нууц үг:

The code at the server will create a valid SQL statement like this:

Сервер дээрх код нь дараах хүчинтэй SQL өгүүлбэрийг үүсгэнэ:

Result – Үр дүн #

SELECT * FROM Users WHERE Name =“” or “”=“” AND Pass =“” or “”=“”

The SQL above is valid and will return all rows from the “Users” table, since OR “”=”” is always TRUE.

Дээрх SQL нь хүчинтэй бөгөөд OR “”=”” нь үргэлж үнэн байдаг тул “Хэрэглэгчид” хүснэгтээс бүх мөрийг буцаана.


SQL Injection Based on Batched SQL Statements – SQL өгүүлбэрүүдийг багцалсан SQL Оруулга #

Most databases support batched SQL statement.

Ихэнх өгөгдлийн сангууд багцалсан SQL өгүүлбэрийг дэмждэг.

A batch of SQL statements is a group of two or more SQL statements, separated by semicolons.

SQL өгүүлбэрүүдийн багц нь хоёр болон түүнээс дээш SQL өгүүлбэрүүдийн бүлэг бөгөөд цэг таслалаар тусгаарлагдсан байдаг.

The SQL statement below will return all rows from the “Users” table, then delete the “Suppliers” table.

Доорх SQL өгүүлбэр нь “Хэрэглэгчид” хүснэгтээс бүх мөрийг буцаагаад “Нийлүүлэгчид” хүснэгтийг устгана.

Example- Жишээ #

SELECT * FROM Users; DROP TABLE Suppliers

Look at the following example:

Дараах жишээг хараарай:

Example – Жишээ #

txtUserId = getRequestString(“UserId”);
txtSQL = “SELECT * FROM Users WHERE UserId = ” + txtUserId;

And the following input:

Болон дараах оролтыг:

Хэрэглэгчийн id:

The valid SQL statement would look like this:

Хүчинтэй SQL өгүүлбэр дараах байдлаар харагдана:

Result – Үр дүн #

SELECT * FROM Users WHERE UserId = 105DROP TABLE Suppliers;

Use SQL Parameters for Protection – SQL Параметрүүдийг Хамгаалалтад ашиглаарай #

To protect a web site from SQL injection, you can use SQL parameters.

SQL оруулгаас вэб сайтыг хамгаалахын тулд та SQL параметрүүдийг ашиглаж болно.

SQL parameters are values that are added to an SQL query at execution time, in a controlled manner.

SQL параметрүүд нь SQL лавлагаанд гүйцэтгэлийн үед хяналттай байдлаар нэмэгддэг утгууд юм.

ASP.NET Razor Example – ASP.NET Razor жишээ #

txtUserId = getRequestString(“UserId”);
txtSQL = “SELECT * FROM Users WHERE UserId = @0”;
db.Execute(txtSQL,txtUserId);

Note that parameters are represented in the SQL statement by a @ marker.

Параметрүүдийг SQL өгүүлбэрт @ тэмдэгээр илэрхийлдгийг анхаарна уу.

The SQL engine checks each parameter to ensure that it is correct for its column and are treated literally, and not as part of the SQL to be executed.

SQL механизм нь параметр бүрийг баганад нь тохирсон эсэхийг шалгаж, SQL дээр ажиллах ёстой хэсэг биш, харин шууд утгаар нь авч үздэг.

Another Example – Өөр нэг жишээ #

txtNam = getRequestString(“CustomerName”);
txtAdd = getRequestString(“Address”);
txtCit = getRequestString(“City”);
txtSQL = “INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)”;
db.Execute(txtSQL,txtNam,txtAdd,txtCit);

Examples – Жишээнүүд #

The following examples shows how to build parameterized queries in some common web languages.

Доорх жишээнүүд нь зарим түгээмэл вэб хэлнүүдэд параметртэй хүсэлтийг хэрхэн бүтээхийг харуулна.

SELECT STATEMENT IN ASP.NET:

ASP.NET-д SELECT өгүүлбэр:

txtUserId = getRequestString(“UserId”);
sql = “SELECT * FROM Customers WHERE CustomerId = @0”;
command = new SqlCommand(sql);
command.Parameters.AddWithValue(“@0”,txtUserId);
command.ExecuteReader();

INSERT INTO STATEMENT IN ASP.NET:

ASP.NET-д INSERT INTO өгүүлбэр:

txtNam = getRequestString(“CustomerName”);
txtAdd = getRequestString(“Address”);
txtCit = getRequestString(“City”);
txtSQL = “INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)”;
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue(“@0”,txtNam);
command.Parameters.AddWithValue(“@1”,txtAdd);
command.Parameters.AddWithValue(“@2”,txtCit);
command.ExecuteNonQuery();

INSERT INTO STATEMENT IN PHP:

PHP-д INSERT INTO өгүүлбэр:

$stmt = $dbh->prepare(“INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)”);
$stmt->bindParam(‘:nam’, $txtNam);
$stmt->bindParam(‘:add’, $txtAdd);
$stmt->bindParam(‘:cit’, $txtCit);
$stmt->execute();

Powered by BetterDocs

Leave a Reply