CG-CTF SQL注入
SQL注入1
题目

访问题目网址

先查看一下源码

仔细分析一下核心源码
<?php
if($_POST[user] && $_POST[pass]) { //判断user和pass两个变量不为空
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); //连接数据库
mysql_select_db(SAE_MYSQL_DB); //选择要使用的库
$user = trim($_POST[user]); //去除输入的user变量两侧的空白字符
$pass = md5(trim($_POST[pass])); //去除pass变量两侧空白字符再进行md5加密
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')"; //根据输入的user和pass构造查询语句
echo '</br>'.$sql; //回显查找语句
$query = mysql_fetch_array(mysql_query($sql)); //使用构造的查询语句查询数据库并返回结果集
if($query[user]=="admin") {
echo "<p>Logged in! flag:******************** </p>";
}
if($query[user] != "admin") {
echo("<p>You are not admin!</p>");
} //判断结果集中的user参数对应的值是不是admin,如果是返回flag,不是则返回 You are not admin!
}
echo $query[user]; //回显查询到的user值
?>
通过分析源码知道了user的值为admin,因为sql查询语句里有and,必须and前后同时成立才可以查询,但是现在不知道pass对应的值,所以考虑能不能不判断pass,直接判断user,于是想到是不是可以将user判断语句闭合并注释后面的内容,这样就不会对pass进行判断,pass就直接输入111,于是构造下面的语句。

这样的话查询语句就变成了
select user from ctf where (user='admin') #') and (pw='111')
尝试提交看看会不会返回flag。

成功拿到flag
补充:Mysql的注释语句有三种
1./* */
注释一段内容,这里明显不适用。
2.--
注释-- 后的语句直到行尾,注意这里的--后面要有一个空格,但是题目中使用了trim()函数去除空格,所以也不适用。
3.#
注释#后的语句直到行尾。
SQL注入2
题目

访问题目网址

还是先查看一下源码

分析核心源码
<?php
if($_POST[user] && $_POST[pass]) {
mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
mysql_select_db(SAE_MYSQL_DB);
$user = $_POST[user];
$pass = md5($_POST[pass]);
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
找到最关键的语句
if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
echo "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
解题思路:
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,达到目的。


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

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)
CG-CTF SQL注入的更多相关文章
- CTF SQL注入
目录 一.宽字节注入 二.基于约束的注入 三.报错注入 四.时间盲注 五.bool盲注 六.order by的注入 六.INSERT.UPDATE.DELETE相关的注入 七.堆叠注入 八.常用绕过 ...
- 一次简单的ctf SQL注入绕过
注入地址:http://103.238.227.13:10087/index.php?id=1 //过滤sql $array = array('table','union','and','or','l ...
- CTF SQL注入知识点
理解常用的登录判断 select * from user where username='admin' and password='123' 数据库元信息 infomation_schema 懂PHP ...
- CTF比赛中SQL注入的一些经验总结
ctf中sql注入下的一些小技巧 最近花了一点时间总结了各大平台中注入的trick,自己还是太菜了,多半都得看题解,就特此做了一个paper方便总结 注释符 以下是Mysql中可以用到的单行注释符: ...
- union注入的几道ctf题,实验吧简单的sql注入1,2,这个看起来有点简单和bugku的成绩单
这几天在做CTF当中遇到了几次sql注入都是union,写篇博客记录学习一下. 首先推荐一篇文章“https://blog.csdn.net/Litbai_zhang/article/details/ ...
- CTF—WEB—sql注入之宽字节注入
宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...
- CTF—WEB—sql注入之无过滤有回显最简单注入
sql注入基础原理 一.Sql注入简介 Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手 ...
- “百度杯”CTF比赛 十月场-Getflag(md5碰撞+sql注入+网站绝对路径)
进去md5碰撞,贴一下脚本代码 import hashlib def md5(value): return hashlib.md5(str(value).encode("utf-8" ...
- sql注入、csrf
◎sql注入产生的原因?又如何防御sql注入? SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用 ...
- sql注入总结(一)--2018自我整理
SQL注入总结 前言: 本文和之后的总结都是进行总结,详细实现过程细节可能不会写出来~ 所有sql语句均是mysql数据库的,其他数据库可能有些函数不同,但是方法大致相同 0x00 SQL注入原理: ...
随机推荐
- Orleans在.net core的开发
Goods 服务 启动 using System; using System.Collections.Generic; using System.Linq; using System.Net; usi ...
- unity3d 柏林噪声 PerlinNoise 规律 算法
测试 每个小数值取100次 print(0.1); LaTest3(0.1f, 0.1f); print("Max:" + La.Max() + "|Min:" ...
- apache与tomcat的区别
1. Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展. 2. Apache和Tomcat都可以做为独立的web服务器来运行,但是A ...
- Python复习第01天---元类底层原理
1.通过元类限制类的名字首字母大写 if not class_name.istitle(): raise TypeError('类的名字首字母需要大写') 2. 控制类中必须要有注释 if not c ...
- 自定义滚动条(Custom ScrollBar)
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- hadoop伪分布模式的配置和一些常用命令
大数据的发展历史 3V:volume.velocity.variety(结构化和非结构化数据).value(价值密度低) 大数据带来的技术挑战 存储容量不断增加 获取有价值的信息的难度:搜索.广告.推 ...
- SpringMVC框架之第一篇
2.SpringMVC介绍 2.1.SpringMVC是什么 SpringMVC是Spring组织下的一个表现层框架.和Struts2一样.它是Spring框架组织下的一部分.我们可以从Spring的 ...
- 暴力破解( Hydra | Medusa)
暴力破解 By : Mirror王宇阳 笔者告知 : 暴力破解的结果是运气和速度的结晶,开始暴力破解前烧一炷香也是必要的! 引用张炳帅的一句话:"你的运气和管理员的安全意识成正比" ...
- Android 项目优化(六):项目开发时优化技巧总结
在之前我们讲了很多能够优化 Android 开发项目质量的方案,这些方案更多的是从一些比较专精的方向切入的,阐述的是一些比较重要且独立的优化方案. 本文我们将总结一下在日常开发过程中我们能够使用的一些 ...
- 智能家居手势识别,只需百度AI即可搞定
上次我尝试做了一个给眼镜加特效,针对的是静态图像,具体文章参考 https://ai.baidu.com/forum/topic/show/942890 . 这次我尝试在视频中加眼镜特效,并且加上手势 ...