安全矩阵

 找回密码
 立即注册
搜索
楼主: Pluto

李佳瑞学习日记

[复制链接]

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-10-21 22:21:12 | 显示全部楼层
本帖最后由 Pluto 于 2020-10-21 22:24 编辑

SQL注入-堆叠注入(堆查询注入)

原文地址;http://www.sqlinjection.net/stacked-queries/   
Stacked injection 汉语翻译过来后,国内有的称为堆查询注入,也有称之为堆叠注入。个人认为称之为堆叠注入更为准确。堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据和调用存储过程的目的。这种技术在SQL注入中还是比较频繁的。
原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
堆叠注入的局限性

堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到API或者数据库引擎不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。


虽然我们前面提到了堆叠查询可以执行任意的sql语句,但是这种注入方式并不是十分的完美的。在我们的web系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。因此,在读取数据时,我们建议使用union(联合)注入。同时在使用堆叠注入之前,我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。

网上的教程


从常用数据库角度出发,介绍几个类型的数据库的相关用法。数据库的基本操作,增删查改。以下列出数据库相关堆叠注入的基本操作。

  • 一. Mysql

(1)新建一个表 select * from users where id=1;create table test like users;


执行成功,我们再去看一下是否新建成功表。


  • 2. 删除上面新建的test表select * from users where id=1;drop table test;
  • 3. 查询数据select * from users where id=1;select 1,2,3;加载文件  select * from users where id=1;select load_file('c:/tmpupbbn.php');
  • 4. 修改数据select * from users where id=1;insert into users(id,username,password)

values('100','new','new');


  • 二. Sql server
  • 1. 增加数据表select * from test;create table sc3(ss CHAR(8));

  • 2. 删除数据表select * from test;drop table sc3;

(3)查询数据select 1,2,3;select * from test;[backcolor=rgba(255, 255, 255, 0.9)]
  • 4. 修改数据select * from test;update test set name='test' where id=3;

  • 5. sqlserver中最为重要的存储过程的执行select * from test where id=1;exec master..xp_cmdshell 'ipconfig'
  • 三. Oracle
  • 上面的介绍中我们已经提及,oracle不能使用堆叠注入,可以从图中看到,当有两条语句在同一行时,直接报错。无效字符。后面的就不往下继续尝试了。

  • 四. Postgresql
  • 1. 新建一个表    select * from user_test;create table user_data(id DATE);

可以看到user_data表已经建好。

  • 2. 删除上面新建的user_data表select * from user_test;delete from user_data;

  • 3. 查询数据select * from user_test;select 1,2,3;

  • 4. 修改数据 select * from user_test;update user_test set name='modify' where name='张三';


【注】本文转自:https://www.bbsmax.com/A/kvJ3Eq9Xdg/



回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-10-30 00:08:55 | 显示全部楼层
sql注入绕过注释符号绕过

常用的注释符有

  1. -- 注释内容
  2. # 注释内容
  3. /*注释内容*/
  4. ;
复制代码

实例

  1. mysql> select * from users -- where id = 1;
  2.     -> ;
  3. +----+----------+----------+
  4. | id | username | password |
  5. +----+----------+----------+
  6. |  1 | test1    | pass     |
  7. |  2 | user2    | pass1    |
复制代码
  1. mysql> select * from users # where id = 2;
  2.     -> ;
  3. +----+----------+----------+
  4. | id | username | password |
  5. +----+----------+----------+
  6. |  1 | test1    | pass     |
  7. |  2 | user2    | pass1    |
复制代码
  1. mysql> select * from users where id = 3 /*+1*/
  2.     -> ;
  3. +----+----------+----------+
  4. | id | username | password |
  5. +----+----------+----------+
  6. |  3 | test3    | pass1    |
  7. +----+----------+----------+
  8. 1 row in set (0.00 sec)
复制代码
大小写绕过

常用于 waf的正则对大小写不敏感的情况,一般都是题目自己故意这样设计。
例如:waf过滤了关键字select,可以尝试使用Select等绕过。

  1. mysql> select * from users where id = -1 union select 1,2,3
  2.     -> ;
  3. +----+----------+----------+
  4. | id | username | password |
  5. +----+----------+----------+
  6. |  1 | 2        | 3        |
  7. +----+----------+----------+
  8. 1 row in set (0.00 sec)

  9. #大小写绕过
  10. mysql> select * from users where id = -1 union Select 1,2,3;
  11. +----+----------+----------+
  12. | id | username | password |
  13. +----+----------+----------+
  14. |  1 | 2        | 3        |
  15. +----+----------+----------+
复制代码
内联注释绕过

内联注释就是把一些特有的仅在MYSQL上的语句放在 /*!...*/ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL中会执行。

  1. mysql> select * from users where id = -1 union /*!select*/ 1,2,3;
  2. +----+----------+----------+
  3. | id | username | password |
  4. +----+----------+----------+
  5. |  1 | 2        | 3        |
  6. +----+----------+----------+
复制代码
双写关键字绕过

在某一些简单的waf中,将关键字select等只使用replace()函数置换为空,这时候可以使用双写关键字绕过。例如select变成seleselectct,在经过waf的处理之后又变成select,达到绕过的要求。

特殊编码绕过
  • 十六进制绕过
    1. mysql> select * from users where username = 0x7465737431;
    2. +----+----------+----------+
    3. | id | username | password |
    4. +----+----------+----------+
    5. |  1 | test1    | pass     |
    6. +----+----------+----------+
    复制代码

  • ascii编码绕过
    Test 等价于
    CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)
    tip:好像新版mysql不能用了
  • 空格过滤绕过

    一般绕过空格过滤的方法有以下几种方法来取代空格

    1. /**/
    2. ()
    3. 回车(url编码中的%0a)
    4. `(tap键上面的按钮)
    5. tap
    6. 两个空格
    复制代码
    实例
    1. mysql> select/**/*/**/from/**/users;
    2. +----+----------+----------+
    3. | id | username | password |
    4. +----+----------+----------+
    5. |  1 | test1    | pass     |
    6. |  2 | user2    | pass1    |
    7. |  3 | test3    | pass1    |
    8. +----+----------+----------+
    复制代码
    1. #注意括号中不能含有*
    2. mysql> select(id)from(users);
    3. +----+
    4. | id |
    5. +----+
    6. |  1 |
    7. |  3 |
    复制代码
    1. mysql> select
    2.     -> *
    3.     -> from
    4.     -> users
    5.     -> where
    6.     -> id = 1;
    7. +----+----------+----------+
    8. | id | username | password |
    9. +----+----------+----------+
    10. |  1 | test1    | pass     |
    复制代码
    1. mysql> select`id`from`users`where`id`=1;
    2. +----+
    3. | id |
    4. +----+
    5. |  1 |
    复制代码
    过滤or and xor not 绕过
    1. and = &&
    2. or = ||
    3. xor = | # 异或
    4. not = !
    复制代码
    过滤等号=绕过
    • 不加通配符的like执行的效果和=一致,所以可以用来绕过。

    正常加上通配符的like:

    1. mysql> select * from users where username like "test%";
    2. +----+----------+----------+
    3. | id | username | password |
    4. +----+----------+----------+
    5. |  1 | test1    | pass     |
    6. |  3 | test3    | pass1    |
    复制代码
    不加上通配符的like可以用来取代=
    1. mysql> select * from users where id like 1;
    2. +----+----------+----------+
    3. | id | username | password |
    4. +----+----------+----------+
    5. |  1 | test1    | pass     |
    6. +----+----------+----------+
    复制代码



回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-11-6 23:33:05 | 显示全部楼层
XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常呼略其危害性。xss是一种发生在web前端的漏洞,所以其危害的对象也主要是前端用户
XSS攻击的主要途径
XSS攻击方法只是利用HTML的属性,作各种的尝试,找出注入的方法。现在对三种主要方式进行分析。
1.第一种:对普通的用户输入,页面原样输出,用户通过对JSCODE的伪装,经过一些操作就会跳出一个木马界面,取得登录用户的Cookie.
2.第二种:在代码区里有用户输入的内容
原则就是,代码区中,绝对不应含有用户输入的东西。
3.第三种:允许用户输入HTML标签的页面。
用户可以提交一些自定义的HTML代码,这种情况是最危险的。因为,IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,又可以使用”/”连接16进制字符串来写,使得过滤变得异常复杂,如下面的四个例子,都可以在IE中运行。
三.跨站脚本漏洞常见类型
1.反射型XSS:
<非持久化> 攻击者事先制作好攻击链接, 需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。
2.存储型XSS:
<持久化> 代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,每当有用户访问该页面的时候都会触发代码执行,这种XSS非常危险,容易造成蠕虫,大量盗窃cookie(虽然还有种DOM型XSS,但是也还是包括在存储型XSS内)。
3.DOM型XSS:
基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
四.跨站脚本漏洞测试流程
1.在目标站点上找到输入点,比如查询接口,留言板等
2.输入一组"特殊字符+唯一识别字符",点击提交后,查看返回源码,是否有做对应的处理。
3.通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
4.提交构造的脚本代码以及各种绕过姿势,看是否可以成功执行,如果成功执行则说明存在xss漏洞
Tips:
1.一般查询接口容易出现反射型xss,留言板容易出现存储型xss
2.由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效或者环境限制了执行。
3.通过变化不同的script,尝试绕过后台过滤机制。


回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-11-10 00:38:02 | 显示全部楼层
XSS 以及相关学习内容(JavaScript 和php)
XSS攻击需要具备两个条件:需要向web页面注入恶意代码;这些恶意代码能够被浏览器成功的执行。
XSS的实质其实是HTML代码与Javscript代码的注入。但由于XSS的攻击对象是与客户对等的Browser端
DOM简介
文档对象模型(Document Object Model),即大名鼎鼎的DOM。
DOM可以被认为是一种通过将页面元素以对象的树形方式表现,以便由Javascript组织处理的实现方法。
DOM 节点

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点
HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树:
常用的DOM方法
用户可通过 JavaScript (以及其他编程语言)对 HTML DOM 进行访问。所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性。
四个重要的DOM属性
nodeName 属性:规定节点的名称。
  • nodeName 是只读的
  • 元素节点的 nodeName 与标签名相同
  • 属性节点的 nodeName 与属性名相同
  • 文本节点的 nodeName 始终是 #text
  • 文档节点的 nodeName 始终是 #document
nodeValue 属性:规定节点的值。
  • 元素节点的 nodeValue 是 undefined 或 null
  • 文本节点的 nodeValue 是文本本身
  • 属性节点的 nodeValue 是属性值
nodeType 属性:返回节点的类型。
  • nodeType 是只读的。
innerHTML 属性:获取元素内容,如:
即text的值为Hello World!
innerHTML可以被赋值,也可读,因此是被引用次数最多的对象属性,同时也是最容易产生安全问题的对象属性。
输入一般在哪里
Location 对象属性
JS通常会通过调用DOM内置对象location来获得用户输入,如引用参数切分可使用location.search,引用完整URL可使用location.href等。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-11-11 23:23:54 | 显示全部楼层
PHP - 数组排序函数
  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列
  • PHP 超级全局变量
  • PHP 超级全局变量列表:
    • $GLOBALS
    • $_SERVER
    • $_REQUEST
    • $_POST
    • $_GET
    • $_FILES
    • $_ENV
    • $_COOKIE
    • $_SESSION





回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-11-15 16:53:06 | 显示全部楼层
今天总结一下这两天所学的内容,有关awd的相关知识
一、 AWD模式简介

AWD:Attack With Defence,比赛中每个队伍维护多台服务器,服务器中存在多个漏洞,利用漏洞攻击其他队伍可以进行得分,修复漏洞可以避免被其他队伍攻击失分。

  • 一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下);
  • 可能会提供一台流量分析虚拟机,可以下载流量文件进行数据分析;
  • flag在主办方的设定下每隔一定时间刷新一轮;
  • 各队一般都有自己的初始分数;
  • flag一旦被其他队伍拿走,该队扣除一定积分;
  • 扣除的积分由获取flag的队伍均分;
  • 主办方会对每个队伍的服务进行check,服务宕机扣除本轮flag分数,扣除的分值由服务check正常的队伍均分;
  • 一般每个队伍会给一个低权限用户,非root权限;

二、 得分方式

比赛中获取flag一般有两种模式:

(1)flag在根目录下,读取flag内容,提交即可得分

(2)拿到其他队伍shell后,执行指定命令(curl 10.0.0.2),即可从上图中flag机获取flag内容;

比赛可能会告诉你其他队伍的IP,也可能不会告诉你,一般在同一个C段或者B段,因此首先可以利用nmap等扫描工具发现其他队伍的IP:

  1. nmap –sn 192.168.71.0/24
复制代码


三、 比赛分工

线下赛一般3人左右,2人防御,1人攻击,因为发现的漏洞可以攻击其他队伍,也要进行修复,所以攻防相辅相成,以攻为守。

比赛中每个队伍可能会维护多个靶机,web、二进制等,也可以每人负责一台,各自负责攻击和防御。


四、 一些“套路”备份!(首先要进行备份并且把服务器中的木马删掉)

比赛开始后第一时间备份服务器中web目录下的文件(/var/www/html),这是自我审计的基础,也是防止服务器在比赛中出现异常的情况下可以立即恢复到初始状态的先决条件。有的比赛可以提供3次左右的恢复初始设置的机会,有的比赛不提供,所以备份十分重要。(老师说这样文件被删掉之后直接覆盖就好,避免了一直扣分)

可以用scp命令,也可用一些图形化的工具:Winscp,FileZilla,操作起来比较方便

  • 口令问题

弱口令的问题几乎是必考,比赛开始后,如果发现每个队伍的SSH账号密码都是一样的(某次比赛中都是phpcms、wordpress),需要立即修改口令,如果被其他队伍改了那就gg了。

Web后台很有可能存在弱口令,一般都是admin/admin,admin/123456,test/test等等,同样需要立即修改,也可以修改其他队伍的后台口令,为本队所用,说不定可以利用后台getshell,比如十分常见的wordpress。

不过有的比赛不允许修改后台口令,如果修改视为服务宕机,这样还是不要动口令的心思了。

  • 预留后门

在维护的服务器上,很有可能已经预留了一个或多个后门,比如一句话木马,这个是送分题,可以利用这个漏洞迅速打一波,还可以视情况“搅屎”,利用这个漏洞一直维持权限,每轮都得分(后面细说)

将服务器中web目录下载到本地,利用D盾扫描,一般就可以发现预留后门:

发现后门后,第一时间删除,同时利用这个漏洞发起第一波攻击,如果利用菜刀连,显然不够优雅,还没连完,人家估计都删的差不多了,因此这个漏洞虽然是送分,但拼的是手速,因此得提前准备好脚本:

配置一下其他队伍地址、shell路径和密码,就可以进行攻击,flag记录在firstround_flag.txt中

  • 常见漏洞

常见的漏洞包括SQL注入、文件包含、文件上传等等。对于SQL注入类的漏洞,一般不会有过滤,可以用sqlmap跑出来,再利用—sql-shell执行select load_file(‘/flag’);即可得到flag,也可以利用into outfile写木马维持权限,但要根据实际情况,可能会遇到权限问题。用sqlmap跑比较耗时,可以利用payload写一个python,自动化进行攻击:

对于文件包含漏洞,直接可以通过../../../../../../flag的方式获取:

上传漏洞一般也是比较简单的黑名单过滤、服务器解析漏洞等等,可以直接上传木马;

五、 权限维持

这里说的方法就比较“搅屎”了,上面说到利用预留后门可以维持权限,主要有两种,一种是“不死马”,另一种是反弹shell

  • “不死马”

利用预留后门,上传上面的“不死马”并访问,就会一直生成.config.php的一句话木马,木马内容可以自行修改,只要别被其他队伍看懂就行。

这个不死马比较猥琐,解决的方法需要重启apache,或者写一个程序不停kill这个不死马进程。(主要内容来源:https://www.cnblogs.com/nul1/p/9595899.html

下面是今天训练的过程

首先 用mopaxterm来连接我们自己的主机

连接

这里要解释一下什么是ssh

SH是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。

主要是为了可以不断更新flag

进去世之后需要输入用户名和密码  用户名:root  密码 windows2000

这个靶场里 木马所在的位置是var->www->html   找到木马的位置之后把他们删掉

然后其他人的木马在相同的位置 我们要做的是通过蚁剑来连接其他人的木马 并且不断的上传新的木马以保证后面还可以通过蚁剑进行连接

上传木马的时候一定要注意上传的木马不能让其他人看到密码 否则会被其他人利用




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-11-27 19:01:06 | 显示全部楼层
SQL注入进阶
1.时间注入攻击
2.堆叠查询注入攻击
3.二次注入攻击
4.宽字节注入攻击
5.cookie注入攻击
6.base64注入攻击
7.XFF注入攻击
SQL绕过技术
1.大小写绕过注入
当web正则过滤的时候对大小写不敏感的情况下使用,一般很少会有这种漏洞
比如当过滤了select的时候我们可以采用SEleCT来查询

2.双写绕过注入
有的waf只会对关键词过滤一次,这时候采用双写的方式可以绕过。
selselectect * from user; 过滤select后变成 select * from user;

3.编码绕过注入
 十六进制:
    select * from users where username = 0x7a68616e677961;

4.内联注释绕过注入
把要使用的查询语句放在/*。。。*/中,这样在一般的数据库是不会执行的,但是在mysql中内联注释中的语句会被执行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2021-2-19 23:46:31 | 显示全部楼层
报了 计算机二级 考式 所以这几天又是重新学习 重新复习  报考了 python和数据库
在python中 值是靠引用传递的 不是真正的值  如果id相同 则使用的是同一个值
修改的是地址
可变类型与不可变类型指的是:数据能够直接修改,如果能直接修改是可变
可变 的  列表 字典 集合
不可变:数字,字符串,元组
对于不可变类型  因为变量不能修改 所以运算不会影响到变量自身
对于可变类型来说 函数体中的运算可能会更改传入的擦描述变量
例如:
  1. def test_function():
  2. a +=a
  3. a = [1,2]
  4. test_function(a)
  5. print(a)
复制代码
还复习了pymysql,熟能生巧,然后看了一下聚合函数,这个含没有练习。
pymysql的使用
from pymysql import connect
Connection 对象
conn=connect(参数列表)

* 参数host:连接的mysql主机,如果本机是'localhost'
* 参数port:连接的mysql主机的端口,默认是3306
* 参数database:数据库的名称
* 参数user:连接的用户名
* 参数password:连接的密码
* 参数charset:通信采用的编码方式,推荐使用utf8

关闭连接 conn.close()

提交数据 conn.commit()
撤销数据 conn.rollback()

通过连接获取游标 cur = conn.cursor()返回Cursor对象,用于执行sql语句并获得结果
Cursor游标对象

获取Cursor对象

  # 调用Connection对象的cursor()方法   
  cur =conn.cursor()

目的: 执行sql语句(使用频度最高的语句为select、insert、update、delete)

使用游标执行SQL语句

execute(operation [, parameters ]) 执行SQL语句,返回受影响的行数,主要用于执行insert、update、delete语句,也可以执行create、alter、drop等语句

关闭游标 cur.close()


获取结果集中的一条

cur.fetchone()返回一个元组 形如 (1,'妲己',18)


获取结果集中的所有

cur.fetchall()执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回 形如((1,'公孙离',20),(2,'妲己',18))

pymysql完成数据查询
import pymysql

# 创建和数据库服务器的连接 服务器地址   端口    用户名     密码  数据库名 通信使用字符和数据库字符集一致
conn = pymysql.connect(host='localhost', port=3306, user='root', password='mysql',database='python_test_1', charset='utf8')

# 获取游标
cursor = conn.cursor()

# 执行SQL语句 返回值就是SQL语句在执行过程中影响的行数
sql = """select * from hero;"""

row_count = cursor.execute(sql)
print("SQL语句执行影响的行数%d" % row_count)

# 取出结果集中一行  返回的结果是一行 (1, '妲己', 2)
# print(cursor.fetchone())

# 取出结果集中的所有数据  返回 ((一行数据),(),())
# ((1, '妲己', 2), (2, '李白', 1), (3, '程咬金', 3), (4, '亚瑟', 5), (5, '荆轲', 99))
for line in cursor.fetchall():
    print(line)

# 关闭游标
cursor.close()

# 关闭连接
conn.close()
pymysql完成对数据库的增删改
import pymysql

conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='mysql',db='python_test_1', charset='utf8')

# 通过连接获取游标
cursor = conn.cursor()


# sql = "delete from hero where id = 5;"
# sql = insert into hero (name) values ('西部大坏蛋孙悟空');
sql = "update hero set kongfuid=444 where id = 4;"

row_count = cursor.execute(sql)
print("SQL语句执行影响的行数%d" % row_count)

# 提交数据到数据库
# conn.commit()

# 回滚数据到什么都不做的状态 即撤销刚刚的修改
conn.rollback()

# 关闭游标和连接
cursor.close()
conn.close()
下面是今天心看的内容,聚合函数
今天看的是数据库中的聚合函数
聚合函数对一组值执行计算,并返回单个值。除了 COUNT 外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用
特点
聚合函数又称函数组,会把当前表当作一个组来统计
不允许出现嵌套 比如sum(max(…))
count(*)函数
count(*) 表示计算总行数
查询学生总数
select count(*) from students;
max()和min()
max(列) 表示求此列的最大值
查询女生的编号最大值
select max(id) from students where gender=2;
min(列) 表示求此列的最小值
查询未删除的学生最小编号
select min(id) from students where is_delete=0;
sum()求和
sum(列) 表示求此列的和
查询男生的总年龄
select sum(age) from students where gender=1;
avg()求平均值
vg(列) 表示求此列的平均值
查询未删除女生的编号平均值
select avg(id) from students where is_delete=0 and gender=2;


回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2021-3-5 23:20:57 | 显示全部楼层
计算机二级的题型

题目1

键盘输入正整数n,按要求把n输出到屏幕,格式要求:宽度为20个字符,减号字符-填充,右对齐,带千位分隔符。如果输入正整数超过20位,则按照真实长度输出。例如:键盘输入正整数n为1234,屏幕输出

  1. n = eval(input("请输入正整数:"))
  2. s = "{:->20,}".format(n)
  3. print(s)
复制代码

题目2

随机选择一个手机品牌屏幕输出。

  1. import random
  2. brandlist = ['华为','苹果','诺基亚','OPPO','小米']
  3. random.seed(1)
  4. i=random.randint(0,4)
  5. name=brandlist[i]
  6. print(name)
复制代码
3.
从键盘输入
4个数字,各数字采用空格分隔,对应为变量x0, y0,x1,y1。 计算两点(x0,y0) 和(x1,y1)之间的距离,例如:键盘输入0135屏幕输出5.00
  1. ntxt = input("请输入4个数字(空格分隔):")
  2. nls=ntxt.split()
  3. x0 = eval(nls[0])
  4. y0 = eval(nls[1])
  5. x1 = eval(nls[2])
  6. y1 = eval(nls[3])
  7. r = pow(pow(x1-x0, 2) + pow(y1-y0, 2), 0.5)
  8. print("{:.2f}".format(r))

复制代码

题目4

键盘输入字符串s,按要求把s输出到屏幕,格式要求:宽度为20个字符,等号字符=填充,居中对齐。如果输入字符串超过20位,则全部输出。

  1. s = input("请输入一个字符串:")
  2. print("{:=^20}".format(s))
复制代码

题目5

键盘输入正整数n,按要求把n输出到屏幕,格式要求:宽度为15个字符,数字右边对齐,不足部分用填充。例如:键盘输入正整数n为1234,屏幕输出1234

  1. n = eval(input("请输入正整数:"))
  2. print("{:*>15}".format(n))
复制代码

题目6

键盘输入正整数n,按要求把n输出到屏幕,格式要求:宽度为15个字符,数字右边对齐,不足部分用*填充。

  1. n = eval(input("请输入正整数:"))
  2. print("{:=^14}".format(n))
复制代码


回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2021-3-13 21:49:05 | 显示全部楼层
Python是一种解释类的编程语言
Python语句通过缩进来体现语句之间的逻辑关系
Python解释器在语法上不支持自然语言编程方式
Python的输入来源包括:文件输入,控制台输入,网络输入,交互界面输入,随机数据输入,内部参数输入等。
IPO指的是:input process Output  输入 处理 输出
>>>是提示符
Python是开源的 不是某个组织所有
续行符 \  续行符之后不允许再存在空格


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 04:42 , Processed in 0.020060 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表