Heim > Artikel > Betrieb und Instandhaltung > Wie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren
Heute verwenden wir Codeql, um Sicherheitsprobleme wie „Cookie ist nicht aktiviert, httponly“ zu analysieren und so unsere Verwendung von Codeql zu vertiefen. Wenn es gut funktioniert, können Sie darüber nachdenken, weitere Schwachstellen in Vulnerability-goapp zu beheben.
Bei der Analyse von Go-Programmen müssen Sie zusätzlich codeql-go herunterladen. Anfällige Golang-Webanwendung für den Bildungsbereich.
pkgadminadmin.go wird wie folgt geändert.
pkgloginlogin.go wird wie folgt geändert.
pkgregisterregister.go wird wie folgt geändert.
Denken Sie daran, die Datenbank nach der Änderung neu zu generieren (wenn Sie die alte Datenbank überschreiben müssen, müssen Sie zuerst die alte löschen und dann eine neue erstellen. #🎜 🎜##🎜🎜 #Zweck
Es besteht darin, mithilfe des Codeql-Skripts die Lücken zu finden, in denen httponly nicht festgelegt ist und httponly festgelegt ist, der Wert von httponly jedoch falsch ist (normalerweise ist dies nicht der Fall). , aber es ist nicht immer möglich) #🎜 🎜#
Quelle und Senke bestimmen
import go from DataFlow::Node sink where exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = sink ) select sink
private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } }Danach definieren wir eine Variable als Sink. Sie bezieht sich auf alle Codeausschnitte, die die Bedingungen erfüllen, zum Beispiel:
import go private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } } from Sink s select s
Also unser Abfrageskript zum Beispiel
import go from StructLit source select source
listet auch alle Strukturen auf, wie wir erwartet haben
#🎜 🎜##🎜 🎜#Der nächste Schritt besteht darin, andere irrelevante Inhalte zu entfernen und den Typ einzuschränken. In Bezug auf die hasQualifiedName-Methode verfügen verschiedene Typen in verschiedenen Codeql-go über dieselbe Methode, die wie folgt definiert ist , Zu welchem Paket gehört das markierte Objekt und wie lautet sein Name?
Wenn Sie sich nicht sicher sind, können Sie die relevanten Felder beispielsweise über getPackage und getName ausdrucken
import go from StructLit source // where source.getType().hasQualifiedName("net/http", "Cookie") select source.getType().getPackage(), source.getType().getName()
Die Ergebnisse sind wie folgt
Wir können zum Beispiel die Quelldefinition finden # wird auch in DataFlow konvertiert: :Eine Unterklasse von Node Senke, Sie können es erhalten, indem Sie einfach TaintConfig definieren. Alle Daten fließen von der Quelle zur Senke. Nr httponly=true Teilmenge. Daher müssen restriktive Bedingungen hinzugefügt werden, d. h. Datenströme, deren HttpOnly-Attribut auf „true“ gesetzt ist, werden von den Ergebnissen ausgeschlossen.
Wir können TaintTracking::isSanitizer von CodeQL verwenden, um harmlose Knoten zu filtern:
override predicate isSanitizer(DataFlow::Node node) { exists(Write w, Field f, DataFlow::Node rhs | f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and w.writesField(node, f, rhs) and rhs.getBoolValue() = true ) }
运行结果如下,但有一处地方需要注意。
红框中实际有对HttpOnly进行设置,但我们的脚本并不能识别这样的一个数据流。后面试了各种方法,最终找到一种解决方式,将isSanitizer修改成以下内容。
override predicate isSanitizer(DataFlow::Node node) { exists(Write w, Field f, DataFlow::Node n, DataFlow::Node rhs | f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and w.writesField(n, f, rhs) and rhs.getBoolValue() = true and node = n.getAPredecessor*()n ) }
其中node=n.getAPredecessor*()
是说node是n的前置数据流节点,数据可以在0个或多个步骤中从node流到n。
加上一些信息,模仿官方的示例,最终脚本如下。
/** * @name Cookie未设置httponly * @description Cookies包含一个HTTPOnly的设置选项,可以使此cookie不能被js读取,而只能用于HTTP请求。 * @kind path-problem * @problem.severity error * @precision low * @id go/Cookie-not-set-httponly * @tags security */ import go import DataFlow::PathGraph private class Source extends DataFlow::Node { Source() { exists(StructLit s | s.getType().hasQualifiedName("net/http", "Cookie") and this.asExpr() = s) } } private class Sink extends DataFlow::Node { Sink() { exists(DataFlow::CallNode c | c.getTarget().hasQualifiedName("net/http", "SetCookie") and c.getArgument(1) = this ) } } class Configuration extends TaintTracking::Configuration { Configuration() { this = "HttpOnly" } override predicate isSource(DataFlow::Node source) { source instanceof Source } override predicate isSink(DataFlow::Node sink) { sink instanceof Sink } override predicate isSanitizer(DataFlow::Node node) { exists(Write w, Field f, DataFlow::Node n, DataFlow::Node rhs | f.hasQualifiedName("net/http", "Cookie", "HttpOnly") and w.writesField(n, f, rhs) and rhs.getBoolValue() = true and node = n.getAPredecessor*() ) } } from Configuration cfg, DataFlow::PathNode source, DataFlow::PathNode sink where cfg.hasFlowPath(source, sink) select sink.getNode(), source, sink, "Cookie-not-set-httponly in $@.", source.getNode(), "here"
最终筛选出存在问题的内容。
Das obige ist der detaillierte Inhalt vonWie Codeql das Problem analysiert, dass Cookies httponly nicht aktivieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!